From cc51e7032bba6e672a15903c78a75355e8773f52 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Wed, 11 Dec 2024 09:14:17 -0500 Subject: [PATCH 01/10] Fixes: #17820 - Store default values from custom fields on newly created module components (#18084) * Store default values from custom fields on newly created module components * Invert if/for lines to avoid repetition --- netbox/dcim/models/devices.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 0f11cb5f3..fe15f9fb4 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -1277,6 +1277,11 @@ class Module(PrimaryModel, ConfigContextModel): if not disable_replication: create_instances.append(template_instance) + # Set default values for any applicable custom fields + if cf_defaults := CustomField.objects.get_defaults_for_model(component_model): + for component in create_instances: + component.custom_field_data = cf_defaults + if component_model is not ModuleBay: component_model.objects.bulk_create(create_instances) # Emit the post_save signal for each newly created object From 26f8c3aae313bc54dffc8713969013218030d4a7 Mon Sep 17 00:00:00 2001 From: Alexander Haase Date: Wed, 11 Dec 2024 16:28:42 +0100 Subject: [PATCH 02/10] Closes 18061: Hide traceback from rendered device config (#18127) * Hide traceback from rendered device config When an exception occurs during device configuration rendering, it usually doesn't contain information about the template being rendered, but rather the trace of how the template was rendered. Since this could confuse users and expose internal server information, it is now hidden. * Improve error message display; replicate changes for VMs --------- Co-authored-by: Jeremy Stretch --- netbox/dcim/views.py | 10 +++--- .../templates/dcim/device/render_config.html | 33 ++++++++++++------- .../virtualmachine/render_config.html | 33 ++++++++++++------- netbox/virtualization/views.py | 10 +++--- 4 files changed, 52 insertions(+), 34 deletions(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index f390be89b..c8474b01d 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1,5 +1,3 @@ -import traceback - from django.contrib import messages from django.contrib.contenttypes.models import ContentType from django.core.paginator import EmptyPage, PageNotAnInteger @@ -2106,7 +2104,8 @@ class DeviceRenderConfigView(generic.ObjectView): # If a direct export has been requested, return the rendered template content as a # downloadable file. if request.GET.get('export'): - response = HttpResponse(context['rendered_config'], content_type='text') + content = context['rendered_config'] or context['error_message'] + response = HttpResponse(content, content_type='text') filename = f"{instance.name or 'config'}.txt" response['Content-Disposition'] = f'attachment; filename="{filename}"' return response @@ -2124,17 +2123,18 @@ class DeviceRenderConfigView(generic.ObjectView): # Render the config template rendered_config = None + error_message = None if config_template := instance.get_config_template(): try: rendered_config = config_template.render(context=context_data) except TemplateError as e: - messages.error(request, _("An error occurred while rendering the template: {error}").format(error=e)) - rendered_config = traceback.format_exc() + error_message = _("An error occurred while rendering the template: {error}").format(error=e) return { 'config_template': config_template, 'context_data': context_data, 'rendered_config': rendered_config, + 'error_message': error_message, } diff --git a/netbox/templates/dcim/device/render_config.html b/netbox/templates/dcim/device/render_config.html index 785939a83..ab2f1c531 100644 --- a/netbox/templates/dcim/device/render_config.html +++ b/netbox/templates/dcim/device/render_config.html @@ -5,7 +5,7 @@ {% block title %}{{ object }} - {% trans "Config" %}{% endblock %} {% block content %} -
+

{% trans "Config Template" %}

@@ -48,19 +48,28 @@
-
-

- {% trans "Rendered Config" %} - - {% trans "Download" %} - -

- {% if config_template %} -
{{ rendered_config }}
+ {% if config_template %} + {% if rendered_config %} +
+

+ {% trans "Rendered Config" %} + + {% trans "Download" %} + +

+
{{ rendered_config }}
+
{% else %} -
{% trans "No configuration template found" %}
+
+

{% trans "Error rendering template" %}

+ {% trans error_message %} +
{% endif %} -
+ {% else %} +
+ {% trans "No configuration template has been assigned for this device." %} +
+ {% endif %}
{% endblock %} diff --git a/netbox/templates/virtualization/virtualmachine/render_config.html b/netbox/templates/virtualization/virtualmachine/render_config.html index 5e7a0711b..fa6f1723b 100644 --- a/netbox/templates/virtualization/virtualmachine/render_config.html +++ b/netbox/templates/virtualization/virtualmachine/render_config.html @@ -5,7 +5,7 @@ {% block title %}{{ object }} - {% trans "Config" %}{% endblock %} {% block content %} -
+

{% trans "Config Template" %}

@@ -48,19 +48,28 @@
-
-

- {% trans "Rendered Config" %} - - {% trans "Download" %} - -

- {% if config_template %} -
{{ rendered_config }}
+ {% if config_template %} + {% if rendered_config %} +
+

+ {% trans "Rendered Config" %} + + {% trans "Download" %} + +

+
{{ rendered_config }}
+
{% else %} -
{% trans "No configuration template found" %}
+
+

{% trans "Error rendering template" %}

+ {% trans error_message %} +
{% endif %} -
+ {% else %} +
+ {% trans "No configuration template has been assigned for this virtual machine." %} +
+ {% endif %}
{% endblock %} diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index d1d65b1ff..f71d56b19 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -1,5 +1,3 @@ -import traceback - from django.contrib import messages from django.db import transaction from django.db.models import Prefetch, Sum @@ -425,7 +423,8 @@ class VirtualMachineRenderConfigView(generic.ObjectView): # If a direct export has been requested, return the rendered template content as a # downloadable file. if request.GET.get('export'): - response = HttpResponse(context['rendered_config'], content_type='text') + content = context['rendered_config'] or context['error_message'] + response = HttpResponse(content, content_type='text') filename = f"{instance.name or 'config'}.txt" response['Content-Disposition'] = f'attachment; filename="{filename}"' return response @@ -443,17 +442,18 @@ class VirtualMachineRenderConfigView(generic.ObjectView): # Render the config template rendered_config = None + error_message = None if config_template := instance.get_config_template(): try: rendered_config = config_template.render(context=context_data) except TemplateError as e: - messages.error(request, _("An error occurred while rendering the template: {error}").format(error=e)) - rendered_config = traceback.format_exc() + error_message = _("An error occurred while rendering the template: {error}").format(error=e) return { 'config_template': config_template, 'context_data': context_data, 'rendered_config': rendered_config, + 'error_message': error_message, } From a15ff294dd95815027575ae65e0483c8ab29ffe6 Mon Sep 17 00:00:00 2001 From: Pl0xym0r <148605740+pl0xym0r@users.noreply.github.com> Date: Wed, 11 Dec 2024 19:16:10 +0100 Subject: [PATCH 03/10] fixes 17465 : add racktype on bulkimport and bulkedit of racks (#18077) * fixes 17465 add racktype on bulkimport and bulkedit of racks * Make width & u_height optional when setting rack_type on import --------- Co-authored-by: Jeremy Stretch --- netbox/dcim/forms/bulk_edit.py | 7 ++++++- netbox/dcim/forms/bulk_import.py | 28 +++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index b2733b60c..e9a86cc4a 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -359,6 +359,11 @@ class RackBulkEditForm(NetBoxModelBulkEditForm): queryset=RackRole.objects.all(), required=False ) + rack_type = DynamicModelChoiceField( + label=_('Rack type'), + queryset=RackType.objects.all(), + required=False, + ) serial = forms.CharField( max_length=50, required=False, @@ -438,7 +443,7 @@ class RackBulkEditForm(NetBoxModelBulkEditForm): model = Rack fieldsets = ( - FieldSet('status', 'role', 'tenant', 'serial', 'asset_tag', 'description', name=_('Rack')), + FieldSet('status', 'role', 'tenant', 'serial', 'asset_tag', 'rack_type', 'description', name=_('Rack')), FieldSet('region', 'site_group', 'site', 'location', name=_('Location')), FieldSet( 'form_factor', 'width', 'u_height', 'desc_units', 'airflow', 'outer_width', 'outer_depth', 'outer_unit', diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 58ae35091..76fae478b 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -256,6 +256,13 @@ class RackImportForm(NetBoxModelImportForm): to_field_name='name', help_text=_('Name of assigned role') ) + rack_type = CSVModelChoiceField( + label=_('Rack type'), + queryset=RackType.objects.all(), + to_field_name='model', + required=False, + help_text=_('Rack type model') + ) form_factor = CSVChoiceField( label=_('Type'), choices=RackFormFactorChoices, @@ -265,8 +272,13 @@ class RackImportForm(NetBoxModelImportForm): width = forms.ChoiceField( label=_('Width'), choices=RackWidthChoices, + required=False, help_text=_('Rail-to-rail width (in inches)') ) + u_height = forms.IntegerField( + required=False, + label=_('Height (U)') + ) outer_unit = CSVChoiceField( label=_('Outer unit'), choices=RackDimensionUnitChoices, @@ -289,9 +301,9 @@ class RackImportForm(NetBoxModelImportForm): class Meta: model = Rack fields = ( - 'site', 'location', 'name', 'facility_id', 'tenant', 'status', 'role', 'form_factor', 'serial', 'asset_tag', - 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth', 'airflow', - 'weight', 'max_weight', 'weight_unit', 'description', 'comments', 'tags', + 'site', 'location', 'name', 'facility_id', 'tenant', 'status', 'role', 'rack_type', 'form_factor', 'serial', + 'asset_tag', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', + 'mounting_depth', 'airflow', 'weight', 'max_weight', 'weight_unit', 'description', 'comments', 'tags', ) def __init__(self, data=None, *args, **kwargs): @@ -303,6 +315,16 @@ class RackImportForm(NetBoxModelImportForm): params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) + def clean(self): + super().clean() + + # width & u_height must be set if not specifying a rack type on import + if not self.instance.pk: + if not self.cleaned_data.get('rack_type') and not self.cleaned_data.get('width'): + raise forms.ValidationError(_("Width must be set if not specifying a rack type.")) + if not self.cleaned_data.get('rack_type') and not self.cleaned_data.get('u_height'): + raise forms.ValidationError(_("U height must be set if not specifying a rack type.")) + class RackReservationImportForm(NetBoxModelImportForm): site = CSVModelChoiceField( From bd5e7a8d1a7ca986cd2fdcec99a51ff25a4d84c9 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 05:02:17 +0000 Subject: [PATCH 04/10] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 720 ++++++++++--------- 1 file changed, 371 insertions(+), 349 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index e94913db9..9bb609694 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-10 05:02+0000\n" +"POT-Creation-Date: 2024-12-12 05:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -195,11 +195,11 @@ msgstr "" #: netbox/circuits/forms/model_forms.py:138 #: netbox/circuits/forms/model_forms.py:154 #: netbox/circuits/tables/circuits.py:113 netbox/dcim/forms/bulk_edit.py:169 -#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:678 -#: netbox/dcim/forms/bulk_edit.py:883 netbox/dcim/forms/bulk_import.py:131 -#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:309 -#: netbox/dcim/forms/bulk_import.py:540 netbox/dcim/forms/bulk_import.py:1311 -#: netbox/dcim/forms/bulk_import.py:1339 netbox/dcim/forms/filtersets.py:87 +#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:683 +#: netbox/dcim/forms/bulk_edit.py:888 netbox/dcim/forms/bulk_import.py:131 +#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:562 netbox/dcim/forms/bulk_import.py:1333 +#: netbox/dcim/forms/bulk_import.py:1361 netbox/dcim/forms/filtersets.py:87 #: netbox/dcim/forms/filtersets.py:225 netbox/dcim/forms/filtersets.py:342 #: netbox/dcim/forms/filtersets.py:439 netbox/dcim/forms/filtersets.py:753 #: netbox/dcim/forms/filtersets.py:997 netbox/dcim/forms/filtersets.py:1021 @@ -397,18 +397,18 @@ msgstr "" #: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:74 #: netbox/dcim/forms/bulk_edit.py:93 netbox/dcim/forms/bulk_edit.py:152 #: netbox/dcim/forms/bulk_edit.py:193 netbox/dcim/forms/bulk_edit.py:211 -#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:433 -#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:482 -#: netbox/dcim/forms/bulk_edit.py:541 netbox/dcim/forms/bulk_edit.py:585 -#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 -#: netbox/dcim/forms/bulk_edit.py:716 netbox/dcim/forms/bulk_edit.py:777 -#: netbox/dcim/forms/bulk_edit.py:829 netbox/dcim/forms/bulk_edit.py:852 -#: netbox/dcim/forms/bulk_edit.py:900 netbox/dcim/forms/bulk_edit.py:970 -#: netbox/dcim/forms/bulk_edit.py:1023 netbox/dcim/forms/bulk_edit.py:1058 -#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_edit.py:1142 -#: netbox/dcim/forms/bulk_edit.py:1187 netbox/dcim/forms/bulk_edit.py:1214 -#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 -#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/bulk_edit.py:1720 +#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:438 +#: netbox/dcim/forms/bulk_edit.py:472 netbox/dcim/forms/bulk_edit.py:487 +#: netbox/dcim/forms/bulk_edit.py:546 netbox/dcim/forms/bulk_edit.py:590 +#: netbox/dcim/forms/bulk_edit.py:624 netbox/dcim/forms/bulk_edit.py:648 +#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_edit.py:782 +#: netbox/dcim/forms/bulk_edit.py:834 netbox/dcim/forms/bulk_edit.py:857 +#: netbox/dcim/forms/bulk_edit.py:905 netbox/dcim/forms/bulk_edit.py:975 +#: netbox/dcim/forms/bulk_edit.py:1028 netbox/dcim/forms/bulk_edit.py:1063 +#: netbox/dcim/forms/bulk_edit.py:1103 netbox/dcim/forms/bulk_edit.py:1147 +#: netbox/dcim/forms/bulk_edit.py:1192 netbox/dcim/forms/bulk_edit.py:1219 +#: netbox/dcim/forms/bulk_edit.py:1237 netbox/dcim/forms/bulk_edit.py:1255 +#: netbox/dcim/forms/bulk_edit.py:1273 netbox/dcim/forms/bulk_edit.py:1725 #: netbox/extras/forms/bulk_edit.py:39 netbox/extras/forms/bulk_edit.py:149 #: netbox/extras/forms/bulk_edit.py:178 netbox/extras/forms/bulk_edit.py:208 #: netbox/extras/forms/bulk_edit.py:256 netbox/extras/forms/bulk_edit.py:274 @@ -554,9 +554,9 @@ msgstr "" #: netbox/circuits/forms/bulk_edit.py:100 #: netbox/circuits/forms/filtersets.py:107 netbox/dcim/forms/bulk_edit.py:207 -#: netbox/dcim/forms/bulk_edit.py:605 netbox/dcim/forms/bulk_edit.py:814 -#: netbox/dcim/forms/bulk_edit.py:1183 netbox/dcim/forms/bulk_edit.py:1210 -#: netbox/dcim/forms/bulk_edit.py:1716 netbox/dcim/forms/filtersets.py:1064 +#: netbox/dcim/forms/bulk_edit.py:610 netbox/dcim/forms/bulk_edit.py:819 +#: netbox/dcim/forms/bulk_edit.py:1188 netbox/dcim/forms/bulk_edit.py:1215 +#: netbox/dcim/forms/bulk_edit.py:1721 netbox/dcim/forms/filtersets.py:1064 #: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479 #: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devices.py:761 #: netbox/dcim/tables/devices.py:1003 netbox/dcim/tables/devicetypes.py:249 @@ -576,16 +576,16 @@ msgstr "" #: netbox/circuits/forms/filtersets.py:126 netbox/core/forms/bulk_edit.py:18 #: netbox/core/forms/filtersets.py:33 netbox/core/tables/change_logging.py:32 #: netbox/core/tables/data.py:20 netbox/core/tables/jobs.py:18 -#: netbox/dcim/forms/bulk_edit.py:792 netbox/dcim/forms/bulk_edit.py:931 -#: netbox/dcim/forms/bulk_edit.py:999 netbox/dcim/forms/bulk_edit.py:1018 -#: netbox/dcim/forms/bulk_edit.py:1041 netbox/dcim/forms/bulk_edit.py:1083 -#: netbox/dcim/forms/bulk_edit.py:1127 netbox/dcim/forms/bulk_edit.py:1178 -#: netbox/dcim/forms/bulk_edit.py:1205 netbox/dcim/forms/bulk_import.py:188 -#: netbox/dcim/forms/bulk_import.py:260 netbox/dcim/forms/bulk_import.py:708 -#: netbox/dcim/forms/bulk_import.py:734 netbox/dcim/forms/bulk_import.py:760 -#: netbox/dcim/forms/bulk_import.py:780 netbox/dcim/forms/bulk_import.py:863 -#: netbox/dcim/forms/bulk_import.py:957 netbox/dcim/forms/bulk_import.py:999 -#: netbox/dcim/forms/bulk_import.py:1213 netbox/dcim/forms/bulk_import.py:1376 +#: netbox/dcim/forms/bulk_edit.py:797 netbox/dcim/forms/bulk_edit.py:936 +#: netbox/dcim/forms/bulk_edit.py:1004 netbox/dcim/forms/bulk_edit.py:1023 +#: netbox/dcim/forms/bulk_edit.py:1046 netbox/dcim/forms/bulk_edit.py:1088 +#: netbox/dcim/forms/bulk_edit.py:1132 netbox/dcim/forms/bulk_edit.py:1183 +#: netbox/dcim/forms/bulk_edit.py:1210 netbox/dcim/forms/bulk_import.py:188 +#: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:730 +#: netbox/dcim/forms/bulk_import.py:756 netbox/dcim/forms/bulk_import.py:782 +#: netbox/dcim/forms/bulk_import.py:802 netbox/dcim/forms/bulk_import.py:885 +#: netbox/dcim/forms/bulk_import.py:979 netbox/dcim/forms/bulk_import.py:1021 +#: netbox/dcim/forms/bulk_import.py:1235 netbox/dcim/forms/bulk_import.py:1398 #: netbox/dcim/forms/filtersets.py:955 netbox/dcim/forms/filtersets.py:1054 #: netbox/dcim/forms/filtersets.py:1175 netbox/dcim/forms/filtersets.py:1247 #: netbox/dcim/forms/filtersets.py:1272 netbox/dcim/forms/filtersets.py:1296 @@ -638,13 +638,13 @@ msgstr "" #: netbox/core/forms/filtersets.py:79 netbox/core/tables/data.py:23 #: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 #: netbox/dcim/forms/bulk_edit.py:107 netbox/dcim/forms/bulk_edit.py:182 -#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:701 -#: netbox/dcim/forms/bulk_edit.py:766 netbox/dcim/forms/bulk_edit.py:798 -#: netbox/dcim/forms/bulk_edit.py:925 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:706 +#: netbox/dcim/forms/bulk_edit.py:771 netbox/dcim/forms/bulk_edit.py:803 +#: netbox/dcim/forms/bulk_edit.py:930 netbox/dcim/forms/bulk_edit.py:1744 #: netbox/dcim/forms/bulk_import.py:88 netbox/dcim/forms/bulk_import.py:147 -#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:505 -#: netbox/dcim/forms/bulk_import.py:659 netbox/dcim/forms/bulk_import.py:1207 -#: netbox/dcim/forms/bulk_import.py:1371 netbox/dcim/forms/bulk_import.py:1435 +#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:527 +#: netbox/dcim/forms/bulk_import.py:681 netbox/dcim/forms/bulk_import.py:1229 +#: netbox/dcim/forms/bulk_import.py:1393 netbox/dcim/forms/bulk_import.py:1457 #: netbox/dcim/forms/filtersets.py:178 netbox/dcim/forms/filtersets.py:237 #: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799 #: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 @@ -707,12 +707,12 @@ msgstr "" #: netbox/circuits/forms/filtersets.py:119 #: netbox/circuits/forms/filtersets.py:241 netbox/dcim/forms/bulk_edit.py:123 #: netbox/dcim/forms/bulk_edit.py:188 netbox/dcim/forms/bulk_edit.py:347 -#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/bulk_edit.py:691 -#: netbox/dcim/forms/bulk_edit.py:804 netbox/dcim/forms/bulk_edit.py:1744 +#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:696 +#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:1749 #: netbox/dcim/forms/bulk_import.py:107 netbox/dcim/forms/bulk_import.py:152 -#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:334 -#: netbox/dcim/forms/bulk_import.py:479 netbox/dcim/forms/bulk_import.py:1219 -#: netbox/dcim/forms/bulk_import.py:1428 netbox/dcim/forms/filtersets.py:173 +#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:356 +#: netbox/dcim/forms/bulk_import.py:501 netbox/dcim/forms/bulk_import.py:1241 +#: netbox/dcim/forms/bulk_import.py:1450 netbox/dcim/forms/filtersets.py:173 #: netbox/dcim/forms/filtersets.py:205 netbox/dcim/forms/filtersets.py:323 #: netbox/dcim/forms/filtersets.py:399 netbox/dcim/forms/filtersets.py:420 #: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:916 @@ -833,11 +833,11 @@ msgstr "" msgid "Upstream speed (Kbps)" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:961 -#: netbox/dcim/forms/bulk_edit.py:1325 netbox/dcim/forms/bulk_edit.py:1342 -#: netbox/dcim/forms/bulk_edit.py:1359 netbox/dcim/forms/bulk_edit.py:1377 -#: netbox/dcim/forms/bulk_edit.py:1472 netbox/dcim/forms/bulk_edit.py:1632 -#: netbox/dcim/forms/bulk_edit.py:1649 +#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:966 +#: netbox/dcim/forms/bulk_edit.py:1330 netbox/dcim/forms/bulk_edit.py:1347 +#: netbox/dcim/forms/bulk_edit.py:1364 netbox/dcim/forms/bulk_edit.py:1382 +#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_edit.py:1637 +#: netbox/dcim/forms/bulk_edit.py:1654 msgid "Mark connected" msgstr "" @@ -883,8 +883,8 @@ msgstr "" #: netbox/circuits/forms/bulk_import.py:95 netbox/dcim/forms/bulk_import.py:90 #: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 -#: netbox/dcim/forms/bulk_import.py:507 netbox/dcim/forms/bulk_import.py:661 -#: netbox/dcim/forms/bulk_import.py:1373 netbox/ipam/forms/bulk_import.py:194 +#: netbox/dcim/forms/bulk_import.py:529 netbox/dcim/forms/bulk_import.py:683 +#: netbox/dcim/forms/bulk_import.py:1395 netbox/ipam/forms/bulk_import.py:194 #: netbox/ipam/forms/bulk_import.py:259 netbox/ipam/forms/bulk_import.py:295 #: netbox/ipam/forms/bulk_import.py:476 #: netbox/virtualization/forms/bulk_import.py:56 @@ -896,9 +896,9 @@ msgstr "" #: netbox/circuits/forms/bulk_import.py:102 #: netbox/circuits/forms/bulk_import.py:162 #: netbox/dcim/forms/bulk_import.py:111 netbox/dcim/forms/bulk_import.py:156 -#: netbox/dcim/forms/bulk_import.py:338 netbox/dcim/forms/bulk_import.py:483 -#: netbox/dcim/forms/bulk_import.py:1223 netbox/dcim/forms/bulk_import.py:1368 -#: netbox/dcim/forms/bulk_import.py:1432 netbox/ipam/forms/bulk_import.py:42 +#: netbox/dcim/forms/bulk_import.py:360 netbox/dcim/forms/bulk_import.py:505 +#: netbox/dcim/forms/bulk_import.py:1245 netbox/dcim/forms/bulk_import.py:1390 +#: netbox/dcim/forms/bulk_import.py:1454 netbox/ipam/forms/bulk_import.py:42 #: netbox/ipam/forms/bulk_import.py:71 netbox/ipam/forms/bulk_import.py:99 #: netbox/ipam/forms/bulk_import.py:119 netbox/ipam/forms/bulk_import.py:139 #: netbox/ipam/forms/bulk_import.py:168 netbox/ipam/forms/bulk_import.py:254 @@ -928,11 +928,11 @@ msgstr "" #: netbox/circuits/forms/filtersets.py:30 #: netbox/circuits/forms/filtersets.py:118 #: netbox/circuits/forms/filtersets.py:200 netbox/dcim/forms/bulk_edit.py:339 -#: netbox/dcim/forms/bulk_edit.py:442 netbox/dcim/forms/bulk_edit.py:683 -#: netbox/dcim/forms/bulk_edit.py:738 netbox/dcim/forms/bulk_edit.py:892 -#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:315 -#: netbox/dcim/forms/bulk_import.py:546 netbox/dcim/forms/bulk_import.py:1317 -#: netbox/dcim/forms/bulk_import.py:1351 netbox/dcim/forms/filtersets.py:95 +#: netbox/dcim/forms/bulk_edit.py:447 netbox/dcim/forms/bulk_edit.py:688 +#: netbox/dcim/forms/bulk_edit.py:743 netbox/dcim/forms/bulk_edit.py:897 +#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:337 +#: netbox/dcim/forms/bulk_import.py:568 netbox/dcim/forms/bulk_import.py:1339 +#: netbox/dcim/forms/bulk_import.py:1373 netbox/dcim/forms/filtersets.py:95 #: netbox/dcim/forms/filtersets.py:322 netbox/dcim/forms/filtersets.py:356 #: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:447 #: netbox/dcim/forms/filtersets.py:719 netbox/dcim/forms/filtersets.py:762 @@ -981,7 +981,7 @@ msgstr "" #: netbox/circuits/forms/filtersets.py:37 #: netbox/circuits/forms/filtersets.py:157 netbox/dcim/forms/bulk_edit.py:113 -#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:867 +#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:872 #: netbox/dcim/forms/bulk_import.py:93 netbox/dcim/forms/filtersets.py:73 #: netbox/dcim/forms/filtersets.py:185 netbox/dcim/forms/filtersets.py:211 #: netbox/dcim/forms/filtersets.py:334 netbox/dcim/forms/filtersets.py:425 @@ -1008,7 +1008,7 @@ msgstr "" #: netbox/circuits/forms/filtersets.py:42 #: netbox/circuits/forms/filtersets.py:162 netbox/dcim/forms/bulk_edit.py:322 -#: netbox/dcim/forms/bulk_edit.py:875 netbox/dcim/forms/filtersets.py:78 +#: netbox/dcim/forms/bulk_edit.py:880 netbox/dcim/forms/filtersets.py:78 #: netbox/dcim/forms/filtersets.py:190 netbox/dcim/forms/filtersets.py:216 #: netbox/dcim/forms/filtersets.py:347 netbox/dcim/forms/filtersets.py:430 #: netbox/dcim/forms/filtersets.py:744 netbox/dcim/forms/filtersets.py:988 @@ -1028,7 +1028,7 @@ msgstr "" #: netbox/circuits/forms/filtersets.py:83 #: netbox/circuits/forms/filtersets.py:102 #: netbox/circuits/forms/filtersets.py:117 netbox/core/forms/filtersets.py:67 -#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:838 +#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:843 #: netbox/dcim/forms/filtersets.py:172 netbox/dcim/forms/filtersets.py:204 #: netbox/dcim/forms/filtersets.py:915 netbox/dcim/forms/filtersets.py:1007 #: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/forms/filtersets.py:1239 @@ -1066,7 +1066,7 @@ msgstr "" msgid "Term Side" msgstr "" -#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1552 +#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1557 #: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:142 #: netbox/ipam/forms/filtersets.py:546 netbox/ipam/forms/model_forms.py:327 #: netbox/templates/extras/configcontext.html:60 @@ -1155,7 +1155,7 @@ msgstr "" #: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52 #: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 #: netbox/dcim/models/devices.py:653 netbox/dcim/models/devices.py:1173 -#: netbox/dcim/models/devices.py:1399 netbox/dcim/models/power.py:96 +#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:96 #: netbox/dcim/models/racks.py:297 netbox/dcim/models/sites.py:154 #: netbox/dcim/models/sites.py:266 netbox/ipam/models/ip.py:253 #: netbox/ipam/models/ip.py:522 netbox/ipam/models/ip.py:730 @@ -1286,7 +1286,7 @@ msgstr "" #: netbox/core/models/jobs.py:46 #: netbox/dcim/models/device_component_templates.py:43 #: netbox/dcim/models/device_components.py:53 netbox/dcim/models/devices.py:593 -#: netbox/dcim/models/devices.py:1330 netbox/dcim/models/devices.py:1395 +#: netbox/dcim/models/devices.py:1335 netbox/dcim/models/devices.py:1400 #: netbox/dcim/models/power.py:39 netbox/dcim/models/power.py:92 #: netbox/dcim/models/racks.py:262 netbox/dcim/models/sites.py:138 #: netbox/extras/models/configs.py:36 netbox/extras/models/configs.py:215 @@ -1739,8 +1739,8 @@ msgid "User name" msgstr "" #: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 -#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1132 -#: netbox/dcim/forms/bulk_edit.py:1410 netbox/dcim/forms/filtersets.py:1370 +#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1137 +#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/filtersets.py:1370 #: netbox/dcim/tables/devices.py:553 netbox/dcim/tables/devicetypes.py:224 #: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 #: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:142 @@ -1844,7 +1844,7 @@ msgid "Completed before" msgstr "" #: netbox/core/forms/filtersets.py:126 netbox/core/forms/filtersets.py:155 -#: netbox/dcim/forms/bulk_edit.py:457 netbox/dcim/forms/filtersets.py:418 +#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/filtersets.py:418 #: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/model_forms.py:316 #: netbox/extras/forms/filtersets.py:456 netbox/extras/forms/filtersets.py:475 #: netbox/extras/tables/tables.py:302 netbox/extras/tables/tables.py:342 @@ -1910,8 +1910,8 @@ msgid "Rack Elevations" msgstr "" #: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1520 -#: netbox/dcim/forms/bulk_edit.py:979 netbox/dcim/forms/bulk_edit.py:1367 -#: netbox/dcim/forms/bulk_edit.py:1385 netbox/dcim/tables/racks.py:158 +#: netbox/dcim/forms/bulk_edit.py:984 netbox/dcim/forms/bulk_edit.py:1372 +#: netbox/dcim/forms/bulk_edit.py:1390 netbox/dcim/tables/racks.py:158 #: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 msgid "Power" msgstr "" @@ -2555,10 +2555,10 @@ msgstr "" #: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 #: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 -#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 #: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 -#: netbox/dcim/forms/bulk_import.py:566 netbox/dcim/forms/bulk_import.py:833 -#: netbox/dcim/forms/bulk_import.py:1088 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 #: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 #: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 #: netbox/dcim/forms/model_forms.py:1509 netbox/dcim/forms/object_import.py:176 @@ -2688,7 +2688,7 @@ msgid "Virtual" msgstr "" #: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 -#: netbox/dcim/forms/bulk_edit.py:1558 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 #: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 #: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 #: netbox/templates/dcim/interface.html:210 @@ -2699,8 +2699,8 @@ msgstr "" msgid "Virtual interfaces" msgstr "" -#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1423 -#: netbox/dcim/forms/bulk_import.py:840 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 #: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 #: netbox/templates/virtualization/vminterface.html:43 #: netbox/virtualization/forms/bulk_edit.py:212 @@ -3106,7 +3106,7 @@ msgstr "" msgid "Device model (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "" @@ -3228,8 +3228,8 @@ msgstr "" msgid "Assigned VID" msgstr "" -#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1526 -#: netbox/dcim/forms/bulk_import.py:891 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 #: netbox/dcim/forms/model_forms.py:1385 #: netbox/dcim/models/device_components.py:711 #: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 @@ -3414,13 +3414,13 @@ msgstr "" msgid "Time zone" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:496 -#: netbox/dcim/forms/bulk_edit.py:560 netbox/dcim/forms/bulk_edit.py:633 -#: netbox/dcim/forms/bulk_edit.py:657 netbox/dcim/forms/bulk_edit.py:750 -#: netbox/dcim/forms/bulk_edit.py:1277 netbox/dcim/forms/bulk_edit.py:1698 -#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:371 -#: netbox/dcim/forms/bulk_import.py:405 netbox/dcim/forms/bulk_import.py:450 -#: netbox/dcim/forms/bulk_import.py:486 netbox/dcim/forms/bulk_import.py:1082 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 #: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 #: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 #: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 @@ -3443,52 +3443,53 @@ msgstr "" msgid "Manufacturer" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:373 -#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:263 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 #: netbox/dcim/forms/filtersets.py:255 #: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:378 -#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:266 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 #: netbox/dcim/forms/filtersets.py:260 #: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:384 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 #: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 #: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:402 -#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "" #: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 -#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:447 -#: netbox/dcim/forms/bulk_edit.py:530 netbox/dcim/forms/bulk_edit.py:553 -#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:596 -#: netbox/dcim/forms/bulk_import.py:384 netbox/dcim/forms/bulk_import.py:416 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 #: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 #: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 #: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 @@ -3511,15 +3512,15 @@ msgstr "" msgid "Weight" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:422 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 #: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:427 -#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:579 -#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:283 -#: netbox/dcim/forms/bulk_import.py:389 netbox/dcim/forms/bulk_import.py:421 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 #: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 #: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" @@ -3548,9 +3549,9 @@ msgstr "" msgid "Numbering" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1272 -#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_import.py:253 -#: netbox/dcim/forms/bulk_import.py:1076 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 #: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 #: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 #: netbox/dcim/forms/model_forms.py:1517 netbox/dcim/forms/object_import.py:181 @@ -3591,24 +3592,29 @@ msgstr "" msgid "Role" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:365 netbox/dcim/forms/bulk_edit.py:713 -#: netbox/dcim/forms/bulk_edit.py:774 netbox/templates/dcim/device.html:104 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 #: netbox/templates/dcim/module.html:77 netbox/templates/dcim/modulebay.html:70 #: netbox/templates/dcim/rack.html:57 #: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:368 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 #: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 #: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:412 netbox/dcim/forms/bulk_edit.py:525 -#: netbox/dcim/forms/bulk_edit.py:569 netbox/dcim/forms/bulk_edit.py:706 -#: netbox/dcim/forms/bulk_import.py:277 netbox/dcim/forms/bulk_import.py:410 -#: netbox/dcim/forms/bulk_import.py:580 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 #: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 #: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 #: netbox/templates/dcim/devicetype.html:65 @@ -3617,10 +3623,10 @@ msgstr "" msgid "Airflow" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:441 netbox/dcim/forms/bulk_edit.py:920 -#: netbox/dcim/forms/bulk_import.py:322 netbox/dcim/forms/bulk_import.py:325 -#: netbox/dcim/forms/bulk_import.py:553 netbox/dcim/forms/bulk_import.py:1358 -#: netbox/dcim/forms/bulk_import.py:1362 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 #: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 #: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 #: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 @@ -3639,7 +3645,7 @@ msgstr "" msgid "Rack" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:445 netbox/dcim/forms/bulk_edit.py:739 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 #: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 #: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 #: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 @@ -3648,53 +3654,53 @@ msgstr "" msgid "Hardware" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:501 netbox/dcim/forms/bulk_import.py:377 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 #: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_edit.py:565 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 #: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:522 netbox/dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:551 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 #: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 #: netbox/templates/dcim/devicebay.html:52 netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:593 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 #: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 #: netbox/templates/dcim/module.html:65 netbox/templates/dcim/modulebay.html:66 #: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:597 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 #: netbox/dcim/forms/model_forms.py:402 #: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:611 netbox/dcim/models/devices.py:484 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 #: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:614 netbox/dcim/forms/bulk_edit.py:638 -#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_import.py:434 -#: netbox/dcim/forms/bulk_import.py:438 netbox/dcim/forms/bulk_import.py:457 -#: netbox/dcim/forms/bulk_import.py:461 netbox/dcim/forms/bulk_import.py:586 -#: netbox/dcim/forms/bulk_import.py:590 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 #: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 #: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 #: netbox/dcim/forms/model_forms.py:555 @@ -3705,19 +3711,19 @@ msgstr "" msgid "Config template" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:1071 -#: netbox/dcim/forms/bulk_import.py:492 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 #: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 #: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:673 netbox/dcim/forms/bulk_import.py:473 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 #: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:696 netbox/dcim/forms/bulk_import.py:498 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 #: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 #: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 #: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 @@ -3731,7 +3737,7 @@ msgstr "" msgid "Platform" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:517 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 #: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 #: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 #: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 @@ -3753,14 +3759,14 @@ msgstr "" msgid "Cluster" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:737 netbox/dcim/forms/bulk_edit.py:1291 -#: netbox/dcim/forms/bulk_edit.py:1688 netbox/dcim/forms/bulk_edit.py:1734 -#: netbox/dcim/forms/bulk_import.py:641 netbox/dcim/forms/bulk_import.py:703 -#: netbox/dcim/forms/bulk_import.py:729 netbox/dcim/forms/bulk_import.py:755 -#: netbox/dcim/forms/bulk_import.py:775 netbox/dcim/forms/bulk_import.py:828 -#: netbox/dcim/forms/bulk_import.py:946 netbox/dcim/forms/bulk_import.py:994 -#: netbox/dcim/forms/bulk_import.py:1011 netbox/dcim/forms/bulk_import.py:1023 -#: netbox/dcim/forms/bulk_import.py:1071 netbox/dcim/forms/bulk_import.py:1422 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 #: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 #: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 #: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 @@ -3819,28 +3825,28 @@ msgstr "" msgid "Device" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:740 +#: netbox/dcim/forms/bulk_edit.py:745 #: netbox/templates/extras/dashboard/widget_config.html:7 #: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:741 netbox/netbox/navigation/menu.py:243 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 #: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:755 netbox/dcim/forms/bulk_import.py:653 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 #: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:994 -#: netbox/dcim/forms/bulk_edit.py:1013 netbox/dcim/forms/bulk_edit.py:1036 -#: netbox/dcim/forms/bulk_edit.py:1078 netbox/dcim/forms/bulk_edit.py:1122 -#: netbox/dcim/forms/bulk_edit.py:1173 netbox/dcim/forms/bulk_edit.py:1200 -#: netbox/dcim/forms/bulk_edit.py:1227 netbox/dcim/forms/bulk_edit.py:1245 -#: netbox/dcim/forms/bulk_edit.py:1263 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 #: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 #: netbox/templates/dcim/consoleport.html:32 #: netbox/templates/dcim/consoleserverport.html:32 @@ -3858,106 +3864,106 @@ msgstr "" msgid "Label" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/filtersets.py:1068 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 #: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/bulk_import.py:1226 -#: netbox/dcim/forms/bulk_import.py:1229 netbox/dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:847 +#: netbox/dcim/forms/bulk_edit.py:852 #: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:915 netbox/dcim/forms/bulk_import.py:1345 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 #: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:937 netbox/dcim/forms/bulk_import.py:1381 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 #: netbox/dcim/forms/filtersets.py:1180 netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:943 netbox/dcim/forms/bulk_import.py:1386 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 #: netbox/dcim/forms/filtersets.py:1185 netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:949 netbox/dcim/forms/filtersets.py:1190 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 #: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:953 netbox/dcim/forms/filtersets.py:1194 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 #: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:957 netbox/dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1049 +#: netbox/dcim/forms/bulk_edit.py:1054 #: netbox/dcim/models/device_component_templates.py:282 #: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1055 +#: netbox/dcim/forms/bulk_edit.py:1060 #: netbox/dcim/models/device_component_templates.py:289 #: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1088 netbox/dcim/forms/bulk_import.py:786 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 #: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 #: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1139 netbox/dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1149 netbox/dcim/forms/bulk_edit.py:1463 -#: netbox/dcim/forms/bulk_import.py:876 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 #: netbox/dcim/forms/object_import.py:90 #: netbox/dcim/models/device_component_templates.py:437 #: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1155 netbox/dcim/forms/bulk_edit.py:1469 -#: netbox/dcim/forms/bulk_import.py:882 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 #: netbox/dcim/forms/object_import.py:95 #: netbox/dcim/models/device_component_templates.py:443 #: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1161 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 #: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1298 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 #: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 #: netbox/templates/dcim/consoleport.html:24 #: netbox/templates/dcim/consoleserverport.html:24 @@ -3971,17 +3977,17 @@ msgstr "" msgid "Module" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1437 netbox/dcim/tables/devices.py:665 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 #: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/forms/model_forms.py:1312 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1448 netbox/dcim/forms/bulk_import.py:714 -#: netbox/dcim/forms/bulk_import.py:740 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 #: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 #: netbox/dcim/tables/devices.py:610 #: netbox/templates/circuits/inc/circuit_termination_fields.html:67 @@ -3990,7 +3996,7 @@ msgstr "" msgid "Speed" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_import.py:885 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 #: netbox/templates/vpn/ikepolicy.html:25 #: netbox/templates/vpn/ipsecprofile.html:21 #: netbox/templates/vpn/ipsecprofile.html:48 @@ -4004,47 +4010,47 @@ msgstr "" msgid "Mode" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1485 netbox/dcim/forms/model_forms.py:1361 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 #: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 #: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 #: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1494 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 #: netbox/dcim/tables/devices.py:579 #: netbox/virtualization/forms/bulk_edit.py:248 #: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1503 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 #: netbox/dcim/tables/devices.py:585 #: netbox/virtualization/forms/bulk_edit.py:256 #: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1531 netbox/dcim/forms/model_forms.py:1348 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 #: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 #: netbox/templates/dcim/interface.html:280 #: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1545 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 #: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 #: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 #: netbox/templates/dcim/interface.html:122 @@ -4053,39 +4059,39 @@ msgstr "" msgid "Addressing" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1546 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 #: netbox/dcim/forms/model_forms.py:1398 #: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1547 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 #: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1548 netbox/dcim/forms/model_forms.py:1399 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 #: netbox/templates/dcim/interface.html:99 #: netbox/virtualization/forms/bulk_edit.py:267 #: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1549 netbox/dcim/forms/model_forms.py:1401 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 #: netbox/virtualization/forms/bulk_edit.py:268 #: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1612 netbox/dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1619 netbox/dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "" @@ -4111,8 +4117,8 @@ msgstr "" msgid "available options" msgstr "" -#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:543 -#: netbox/dcim/forms/bulk_import.py:1342 netbox/ipam/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 #: netbox/ipam/forms/bulk_import.py:457 #: netbox/virtualization/forms/bulk_import.py:63 #: netbox/virtualization/forms/bulk_import.py:89 @@ -4135,15 +4141,15 @@ msgstr "" msgid "The lowest-numbered position in the rack" msgstr "" -#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "" -#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "" @@ -4155,218 +4161,230 @@ msgstr "" msgid "Name of assigned role" msgstr "" -#: netbox/dcim/forms/bulk_import.py:280 netbox/dcim/forms/bulk_import.py:413 -#: netbox/dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "" -#: netbox/dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "" -#: netbox/dcim/forms/bulk_import.py:319 netbox/dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:328 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 #: netbox/dcim/tables/racks.py:222 #: netbox/templates/dcim/rackreservation.html:12 #: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "" -#: netbox/dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "" -#: netbox/dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "" -#: netbox/dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "" -#: netbox/dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "" -#: netbox/dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "" -#: netbox/dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "" -#: netbox/dcim/forms/bulk_import.py:476 netbox/dcim/forms/bulk_import.py:1425 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 #: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "" -#: netbox/dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "" -#: netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "" -#: netbox/dcim/forms/bulk_import.py:502 +#: netbox/dcim/forms/bulk_import.py:524 #: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "" -#: netbox/dcim/forms/bulk_import.py:510 netbox/dcim/forms/bulk_import.py:514 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 #: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "" -#: netbox/dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "" -#: netbox/dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "" -#: netbox/dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "" -#: netbox/dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "" -#: netbox/dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "" -#: netbox/dcim/forms/bulk_import.py:647 netbox/dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "" -#: netbox/dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "" -#: netbox/dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "" -#: netbox/dcim/forms/bulk_import.py:664 netbox/dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "" -#: netbox/dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "" -#: netbox/dcim/forms/bulk_import.py:671 netbox/dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "" -#: netbox/dcim/forms/bulk_import.py:711 netbox/dcim/forms/bulk_import.py:737 -#: netbox/dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:719 netbox/dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "" -#: netbox/dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "" -#: netbox/dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:837 netbox/dcim/forms/model_forms.py:1323 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 #: netbox/virtualization/forms/bulk_import.py:155 #: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "" -#: netbox/dcim/forms/bulk_import.py:844 netbox/dcim/forms/model_forms.py:1331 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 #: netbox/virtualization/forms/bulk_import.py:162 #: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "" -#: netbox/dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "" -#: netbox/dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "" -#: netbox/dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "" -#: netbox/dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "" -#: netbox/dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "" -#: netbox/dcim/forms/bulk_import.py:868 netbox/dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "" -#: netbox/dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "" -#: netbox/dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:888 +#: netbox/dcim/forms/bulk_import.py:910 #: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:895 netbox/ipam/forms/bulk_import.py:161 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 #: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 #: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 #: netbox/ipam/forms/filtersets.py:336 @@ -4374,171 +4392,171 @@ msgstr "" msgid "Assigned VRF" msgstr "" -#: netbox/dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "" -#: netbox/dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "" -#: netbox/dcim/forms/bulk_import.py:951 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 #: netbox/dcim/forms/model_forms.py:1582 netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "" -#: netbox/dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "" -#: netbox/dcim/forms/bulk_import.py:959 netbox/dcim/forms/bulk_import.py:1000 -#: netbox/dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1028 netbox/dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "" -#: netbox/dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1174 netbox/dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1180 netbox/dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1184 netbox/dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1210 +#: netbox/dcim/forms/bulk_import.py:1232 #: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1293 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 #: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 #: netbox/templates/dcim/virtualchassis.html:27 #: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1439 netbox/dcim/forms/model_forms.py:1677 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 #: netbox/templates/dcim/device.html:190 #: netbox/templates/dcim/virtualdevicecontext.html:30 #: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1446 netbox/dcim/forms/model_forms.py:1686 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 #: netbox/templates/dcim/device.html:206 #: netbox/templates/dcim/virtualdevicecontext.html:41 #: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "" @@ -4619,10 +4637,6 @@ msgstr "" msgid "Facility" msgstr "" -#: netbox/dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "" - #: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "" @@ -5892,12 +5906,12 @@ msgstr "" msgid "rack face" msgstr "" -#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1415 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 #: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "" -#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1423 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 #: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "" @@ -6055,54 +6069,54 @@ msgid "" "device ({device})." msgstr "" -#: netbox/dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "" -#: netbox/dcim/models/devices.py:1347 netbox/dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "" -#: netbox/dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "The selected master ({master}) is not assigned to this virtual chassis." msgstr "" -#: netbox/dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " "form a cross-chassis LAG interfaces." msgstr "" -#: netbox/dcim/models/devices.py:1404 netbox/vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "" -#: netbox/dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "" -#: netbox/dcim/models/devices.py:1433 netbox/extras/models/customfields.py:225 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 #: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 #: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "" -#: netbox/dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "" -#: netbox/dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "" -#: netbox/dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "" -#: netbox/dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" @@ -6490,7 +6504,7 @@ msgstr "" #: netbox/netbox/navigation/menu.py:75 #: netbox/virtualization/forms/model_forms.py:122 #: netbox/virtualization/tables/clusters.py:83 -#: netbox/virtualization/views.py:206 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "" @@ -6570,8 +6584,8 @@ msgid "Power outlets" msgstr "" #: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 -#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1042 -#: netbox/dcim/views.py:1281 netbox/dcim/views.py:1977 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 #: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 #: netbox/templates/dcim/device/base.html:37 #: netbox/templates/dcim/device_list.html:43 @@ -6583,7 +6597,7 @@ msgstr "" #: netbox/templates/virtualization/virtualmachine/base.html:27 #: netbox/templates/virtualization/virtualmachine_list.html:14 #: netbox/virtualization/tables/virtualmachines.py:101 -#: netbox/virtualization/views.py:366 netbox/wireless/tables/wirelesslan.py:55 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "" @@ -6609,8 +6623,8 @@ msgid "Module Bay" msgstr "" #: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 -#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1117 -#: netbox/dcim/views.py:2075 netbox/netbox/navigation/menu.py:103 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 #: netbox/templates/dcim/device/base.html:52 #: netbox/templates/dcim/device_list.html:71 #: netbox/templates/dcim/devicetype/base.html:49 @@ -6735,8 +6749,8 @@ msgstr "" msgid "Instances" msgstr "" -#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:982 -#: netbox/dcim/views.py:1221 netbox/dcim/views.py:1913 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 #: netbox/netbox/navigation/menu.py:97 #: netbox/templates/dcim/device/base.html:25 #: netbox/templates/dcim/device_list.html:15 @@ -6746,8 +6760,8 @@ msgstr "" msgid "Console Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:997 -#: netbox/dcim/views.py:1236 netbox/dcim/views.py:1929 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 #: netbox/netbox/navigation/menu.py:98 #: netbox/templates/dcim/device/base.html:28 #: netbox/templates/dcim/device_list.html:22 @@ -6757,8 +6771,8 @@ msgstr "" msgid "Console Server Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1012 -#: netbox/dcim/views.py:1251 netbox/dcim/views.py:1945 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 #: netbox/netbox/navigation/menu.py:99 #: netbox/templates/dcim/device/base.html:31 #: netbox/templates/dcim/device_list.html:29 @@ -6768,8 +6782,8 @@ msgstr "" msgid "Power Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1027 -#: netbox/dcim/views.py:1266 netbox/dcim/views.py:1961 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 #: netbox/netbox/navigation/menu.py:100 #: netbox/templates/dcim/device/base.html:34 #: netbox/templates/dcim/device_list.html:36 @@ -6779,8 +6793,8 @@ msgstr "" msgid "Power Outlets" msgstr "" -#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1057 -#: netbox/dcim/views.py:1296 netbox/dcim/views.py:1999 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 #: netbox/netbox/navigation/menu.py:95 #: netbox/templates/dcim/device/base.html:40 #: netbox/templates/dcim/devicetype/base.html:37 @@ -6789,8 +6803,8 @@ msgstr "" msgid "Front Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1072 -#: netbox/dcim/views.py:1311 netbox/dcim/views.py:2015 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 #: netbox/netbox/navigation/menu.py:96 #: netbox/templates/dcim/device/base.html:43 #: netbox/templates/dcim/device_list.html:50 @@ -6800,16 +6814,16 @@ msgstr "" msgid "Rear Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1102 -#: netbox/dcim/views.py:2055 netbox/netbox/navigation/menu.py:102 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 #: netbox/templates/dcim/device/base.html:49 #: netbox/templates/dcim/device_list.html:57 #: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "" -#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1087 -#: netbox/dcim/views.py:1326 netbox/dcim/views.py:2035 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 #: netbox/netbox/navigation/menu.py:101 #: netbox/templates/dcim/device/base.html:46 #: netbox/templates/dcim/device_list.html:64 @@ -6874,28 +6888,28 @@ msgstr "" msgid "Test case must set peer_termination_type" msgstr "" -#: netbox/dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "" -#: netbox/dcim/views.py:740 netbox/netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "" -#: netbox/dcim/views.py:759 netbox/templates/dcim/location.html:90 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 #: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "" -#: netbox/dcim/views.py:2088 netbox/extras/forms/model_forms.py:577 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 #: netbox/templates/extras/configcontext.html:10 #: netbox/virtualization/forms/model_forms.py:225 -#: netbox/virtualization/views.py:407 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "" -#: netbox/dcim/views.py:2098 netbox/virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "" @@ -6906,7 +6920,7 @@ msgstr "" #: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 #: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 -#: netbox/virtualization/views.py:180 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "" @@ -10746,7 +10760,7 @@ msgstr "" #: netbox/templates/virtualization/virtualmachine/base.html:32 #: netbox/templates/virtualization/virtualmachine_list.html:21 #: netbox/virtualization/tables/virtualmachines.py:104 -#: netbox/virtualization/views.py:388 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "" @@ -12268,19 +12282,23 @@ msgstr "" msgid "Context Data" msgstr "" -#: netbox/templates/dcim/device/render_config.html:53 -#: netbox/templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "" -#: netbox/templates/dcim/device/render_config.html:55 -#: netbox/templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "" -#: netbox/templates/dcim/device/render_config.html:61 -#: netbox/templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" + +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." msgstr "" #: netbox/templates/dcim/device_edit.html:44 @@ -13894,6 +13912,10 @@ msgstr "" msgid "Add Virtual Disk" msgstr "" +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + #: netbox/templates/vpn/ikepolicy.html:10 #: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" @@ -15070,12 +15092,12 @@ msgstr "" msgid "virtual disks" msgstr "" -#: netbox/virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "" -#: netbox/virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "" From dbaa9c1ce17a9e19f81bc24b4559569f84e3f2c2 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Thu, 12 Dec 2024 08:16:28 -0500 Subject: [PATCH 05/10] Fixes: #18021 - Clear Swagger/drf-spectacular API cache on startup (#18174) * Clear Swagger API cache on startup * Clear entire Redis cache on startup if DEBUG=True --- netbox/core/apps.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/netbox/core/apps.py b/netbox/core/apps.py index 1dfc7a65e..0811e5cb2 100644 --- a/netbox/core/apps.py +++ b/netbox/core/apps.py @@ -1,4 +1,6 @@ from django.apps import AppConfig +from django.conf import settings +from django.core.cache import cache from django.db import models from django.db.migrations.operations import AlterModelOptions @@ -22,3 +24,7 @@ class CoreConfig(AppConfig): # Register models register_models(*self.get_models()) + + # Clear Redis cache on startup in development mode + if settings.DEBUG: + cache.clear() From 8e427e57ea8fa255c73304cdcfc7c08156121a1c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 12 Dec 2024 08:36:56 -0500 Subject: [PATCH 06/10] Closes #18211: Enable dynamic registration of request processors (#18212) * Closes #18211: Enable dynamic registration of request processors * Tweak syntax --- docs/development/application-registry.md | 4 ++++ netbox/netbox/context_managers.py | 2 ++ netbox/netbox/middleware.py | 10 +++++++--- netbox/netbox/registry.py | 1 + netbox/netbox/utils.py | 10 ++++++++++ 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/docs/development/application-registry.md b/docs/development/application-registry.md index 570563431..fc96bfd76 100644 --- a/docs/development/application-registry.md +++ b/docs/development/application-registry.md @@ -49,6 +49,10 @@ This key lists all models which have been registered in NetBox which are not des This store maintains all registered items for plugins, such as navigation menus, template extensions, etc. +### `request_processors` + +A list of context managers to invoke when processing a request e.g. in middleware or when executing a background job. Request processors can be registered with the `@register_request_processor` decorator. + ### `search` A dictionary mapping each model (identified by its app and label) to its search index class, if one has been registered for it. diff --git a/netbox/netbox/context_managers.py b/netbox/netbox/context_managers.py index ca434df82..7b01cce94 100644 --- a/netbox/netbox/context_managers.py +++ b/netbox/netbox/context_managers.py @@ -1,9 +1,11 @@ from contextlib import contextmanager from netbox.context import current_request, events_queue +from netbox.utils import register_request_processor from extras.events import flush_events +@register_request_processor @contextmanager def event_tracking(request): """ diff --git a/netbox/netbox/middleware.py b/netbox/netbox/middleware.py index 8012965a4..b9424bd7c 100644 --- a/netbox/netbox/middleware.py +++ b/netbox/netbox/middleware.py @@ -1,3 +1,5 @@ +from contextlib import ExitStack + import logging import uuid @@ -10,7 +12,7 @@ from django.db.utils import InternalError from django.http import Http404, HttpResponseRedirect from netbox.config import clear_config, get_config -from netbox.context_managers import event_tracking +from netbox.registry import registry from netbox.views import handler_500 from utilities.api import is_api_request from utilities.error_handlers import handle_rest_api_exception @@ -32,8 +34,10 @@ class CoreMiddleware: # Assign a random unique ID to the request. This will be used for change logging. request.id = uuid.uuid4() - # Enable the event_tracking context manager and process the request. - with event_tracking(request): + # Apply all registered request processors + with ExitStack() as stack: + for request_processor in registry['request_processors']: + stack.enter_context(request_processor(request)) response = self.get_response(request) # Check if language cookie should be renewed diff --git a/netbox/netbox/registry.py b/netbox/netbox/registry.py index 0920cbccf..5dc5efb77 100644 --- a/netbox/netbox/registry.py +++ b/netbox/netbox/registry.py @@ -29,6 +29,7 @@ registry = Registry({ 'model_features': dict(), 'models': collections.defaultdict(set), 'plugins': dict(), + 'request_processors': list(), 'search': dict(), 'tables': collections.defaultdict(dict), 'views': collections.defaultdict(dict), diff --git a/netbox/netbox/utils.py b/netbox/netbox/utils.py index f27d1b5f7..f2c34722c 100644 --- a/netbox/netbox/utils.py +++ b/netbox/netbox/utils.py @@ -3,6 +3,7 @@ from netbox.registry import registry __all__ = ( 'get_data_backend_choices', 'register_data_backend', + 'register_request_processor', ) @@ -24,3 +25,12 @@ def register_data_backend(): return cls return _wrapper + + +def register_request_processor(func): + """ + Decorator for registering a request processor. + """ + registry['request_processors'].append(func) + + return func From abfa28dc56958327efa7225059c99f58228b901a Mon Sep 17 00:00:00 2001 From: bctiemann Date: Thu, 12 Dec 2024 09:00:46 -0500 Subject: [PATCH 07/10] Fixes: #18150 - Get pagination limit with default 0 (#18151) * Wait until job1 is scheduled before enqueueing job2 * Clamp limit=0 to default_limit * Handle unspecified limit explicitly so as to return min(PAGINATE_COUNT, MAX_PAGE_SIZE) * Revert original min() * Coerce MAX_PAGE_SIZE to be at least PAGINATE_COUNT * Raise ImproperlyConfigured error if MAX_PAGE_SIZE < PAGINATE_COUNT * Revert test behavior * Revert "Revert test behavior" This reverts commit 5087a1111a9ba4126a7ea492bfaae5f6e71957cb. * Revert "Raise ImproperlyConfigured error if MAX_PAGE_SIZE < PAGINATE_COUNT" This reverts commit 5dd93c096d64292a034d1e1f79a5955b63f7f7f1. --- netbox/netbox/api/pagination.py | 4 +++- netbox/utilities/tests/test_api.py | 19 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/netbox/netbox/api/pagination.py b/netbox/netbox/api/pagination.py index 5ecade264..961d52477 100644 --- a/netbox/netbox/api/pagination.py +++ b/netbox/netbox/api/pagination.py @@ -38,12 +38,14 @@ class OptionalLimitOffsetPagination(LimitOffsetPagination): def get_limit(self, request): if self.limit_query_param: + MAX_PAGE_SIZE = get_config().MAX_PAGE_SIZE + if MAX_PAGE_SIZE: + MAX_PAGE_SIZE = max(MAX_PAGE_SIZE, self.default_limit) try: limit = int(request.query_params[self.limit_query_param]) if limit < 0: raise ValueError() # Enforce maximum page size, if defined - MAX_PAGE_SIZE = get_config().MAX_PAGE_SIZE if MAX_PAGE_SIZE: return MAX_PAGE_SIZE if limit == 0 else min(limit, MAX_PAGE_SIZE) return limit diff --git a/netbox/utilities/tests/test_api.py b/netbox/utilities/tests/test_api.py index ba0c3c4f8..2c3ba0566 100644 --- a/netbox/utilities/tests/test_api.py +++ b/netbox/utilities/tests/test_api.py @@ -144,6 +144,19 @@ class APIPaginationTestCase(APITestCase): self.assertIsNone(response.data['previous']) self.assertEqual(len(response.data['results']), page_size) + @override_settings(MAX_PAGE_SIZE=30) + def test_default_page_size_with_small_max_page_size(self): + response = self.client.get(self.url, format='json', **self.header) + page_size = get_config().MAX_PAGE_SIZE + paginate_count = get_config().PAGINATE_COUNT + self.assertLess(page_size, 100, "Default page size not sufficient for data set") + + self.assertHttpStatus(response, status.HTTP_200_OK) + self.assertEqual(response.data['count'], 100) + self.assertTrue(response.data['next'].endswith(f'?limit={paginate_count}&offset={paginate_count}')) + self.assertIsNone(response.data['previous']) + self.assertEqual(len(response.data['results']), paginate_count) + def test_custom_page_size(self): response = self.client.get(f'{self.url}?limit=10', format='json', **self.header) @@ -153,15 +166,15 @@ class APIPaginationTestCase(APITestCase): self.assertIsNone(response.data['previous']) self.assertEqual(len(response.data['results']), 10) - @override_settings(MAX_PAGE_SIZE=20) + @override_settings(MAX_PAGE_SIZE=80) def test_max_page_size(self): response = self.client.get(f'{self.url}?limit=0', format='json', **self.header) self.assertHttpStatus(response, status.HTTP_200_OK) self.assertEqual(response.data['count'], 100) - self.assertTrue(response.data['next'].endswith('?limit=20&offset=20')) + self.assertTrue(response.data['next'].endswith('?limit=80&offset=80')) self.assertIsNone(response.data['previous']) - self.assertEqual(len(response.data['results']), 20) + self.assertEqual(len(response.data['results']), 80) @override_settings(MAX_PAGE_SIZE=0) def test_max_page_size_disabled(self): From 2da1a754c4e3187419272864ac3c72a0548dcb0e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 12 Dec 2024 08:41:27 -0500 Subject: [PATCH 08/10] Fixes #18213: Enable searching for ASN ranges by name --- netbox/ipam/filtersets.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 894219c64..033f0a4dc 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -211,8 +211,10 @@ class ASNRangeFilterSet(OrganizationalModelFilterSet, TenancyFilterSet): def search(self, queryset, name, value): if not value.strip(): return queryset - qs_filter = Q(description__icontains=value) - return queryset.filter(qs_filter) + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) + ) class ASNFilterSet(OrganizationalModelFilterSet, TenancyFilterSet): From e63fe23af859d69c5960095ed812c99f782e5476 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 12 Dec 2024 10:03:19 -0500 Subject: [PATCH 09/10] Release v4.1.8 --- .../ISSUE_TEMPLATE/01-feature_request.yaml | 2 +- .github/ISSUE_TEMPLATE/02-bug_report.yaml | 2 +- docs/release-notes/version-4.1.md | 28 +- .../dist/graphiql/graphiql.min.js | 5568 ++++---- .../project-static/dist/netbox-external.css | Bin 367160 -> 367126 bytes netbox/project-static/dist/netbox.js | Bin 390388 -> 390052 bytes netbox/project-static/dist/netbox.js.map | Bin 527142 -> 524225 bytes .../netbox-graphiql/package.json | 4 +- netbox/project-static/package.json | 8 +- .../src/select/classes/dynamicTomSelect.ts | 39 +- netbox/project-static/tsconfig.json | 4 +- netbox/project-static/yarn.lock | 82 +- netbox/release.yaml | 4 +- netbox/translations/cs/LC_MESSAGES/django.mo | Bin 229328 -> 229001 bytes netbox/translations/cs/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/da/LC_MESSAGES/django.mo | Bin 222153 -> 221815 bytes netbox/translations/da/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/de/LC_MESSAGES/django.mo | Bin 234250 -> 237305 bytes netbox/translations/de/LC_MESSAGES/django.po | 11107 +++++++++------- netbox/translations/es/LC_MESSAGES/django.mo | Bin 235650 -> 235309 bytes netbox/translations/es/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/fr/LC_MESSAGES/django.mo | Bin 237671 -> 237343 bytes netbox/translations/fr/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/it/LC_MESSAGES/django.mo | Bin 233875 -> 233546 bytes netbox/translations/it/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/ja/LC_MESSAGES/django.mo | Bin 251566 -> 251237 bytes netbox/translations/ja/LC_MESSAGES/django.po | 11062 ++++++++------- netbox/translations/nl/LC_MESSAGES/django.mo | Bin 230015 -> 229707 bytes netbox/translations/nl/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/pl/LC_MESSAGES/django.mo | Bin 231612 -> 231288 bytes netbox/translations/pl/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/pt/LC_MESSAGES/django.mo | Bin 232620 -> 232267 bytes netbox/translations/pt/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/ru/LC_MESSAGES/django.mo | Bin 297341 -> 296938 bytes netbox/translations/ru/LC_MESSAGES/django.po | 11066 ++++++++------- netbox/translations/tr/LC_MESSAGES/django.mo | Bin 226285 -> 225979 bytes netbox/translations/tr/LC_MESSAGES/django.po | 11064 ++++++++------- netbox/translations/uk/LC_MESSAGES/django.mo | Bin 298841 -> 299267 bytes netbox/translations/uk/LC_MESSAGES/django.po | 11074 ++++++++------- netbox/translations/zh/LC_MESSAGES/django.mo | Bin 209120 -> 208819 bytes netbox/translations/zh/LC_MESSAGES/django.po | 11062 ++++++++------- requirements.txt | 14 +- 42 files changed, 85736 insertions(+), 74982 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01-feature_request.yaml b/.github/ISSUE_TEMPLATE/01-feature_request.yaml index ec755cd0c..6714d1357 100644 --- a/.github/ISSUE_TEMPLATE/01-feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/01-feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v4.1.7 + placeholder: v4.1.8 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/02-bug_report.yaml b/.github/ISSUE_TEMPLATE/02-bug_report.yaml index 3ae3cbd33..72836017b 100644 --- a/.github/ISSUE_TEMPLATE/02-bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/02-bug_report.yaml @@ -39,7 +39,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v4.1.7 + placeholder: v4.1.8 validations: required: true - type: dropdown diff --git a/docs/release-notes/version-4.1.md b/docs/release-notes/version-4.1.md index 397741171..06ff12fef 100644 --- a/docs/release-notes/version-4.1.md +++ b/docs/release-notes/version-4.1.md @@ -1,6 +1,32 @@ # NetBox v4.1 -## v4.1.7 (FUTURE) +## v4.1.8 (2024-12-12) + +### Enhancements + +* [#17071](https://github.com/netbox-community/netbox/issues/17071) - Enable OOB IP address designation during bulk import +* [#17465](https://github.com/netbox-community/netbox/issues/17465) - Enable designation of rack type during bulk import & bulk edit +* [#17889](https://github.com/netbox-community/netbox/issues/17889) - Enable designating an IP address as out-of-band for a device upon creation +* [#17960](https://github.com/netbox-community/netbox/issues/17960) - Add L2TP, PPTP, Wireguard, and OpenVPN tunnel types +* [#18021](https://github.com/netbox-community/netbox/issues/18021) - Automatically clear cache on restart when `DEBUG` is enabled +* [#18061](https://github.com/netbox-community/netbox/issues/18061) - Omit stack trace from rendered device/VM configuration when an exception is raised +* [#18065](https://github.com/netbox-community/netbox/issues/18065) - Include status in device details when hovering on rack elevation +* [#18211](https://github.com/netbox-community/netbox/issues/18211) - Enable the dynamic registration of context managers for request processing + +### Bug Fixes + +* [#14044](https://github.com/netbox-community/netbox/issues/14044) - Fix unhandled AttributeError exception when bulk renaming objects +* [#17490](https://github.com/netbox-community/netbox/issues/17490) - Fix dynamic inclusion support for config templates +* [#17810](https://github.com/netbox-community/netbox/issues/17810) - Fix validation of racked device fields when modifying via REST API +* [#17820](https://github.com/netbox-community/netbox/issues/17820) - Ensure default custom field values are populated when creating new modules +* [#18044](https://github.com/netbox-community/netbox/issues/18044) - Show plugin-generated alerts within UI views for custom scripts +* [#18150](https://github.com/netbox-community/netbox/issues/18150) - Fix REST API pagination for low `MAX_PAGE_SIZE` values +* [#18183](https://github.com/netbox-community/netbox/issues/18183) - Omit UI navigation bar when printing +* [#18213](https://github.com/netbox-community/netbox/issues/18213) - Fix searching for ASN ranges by name + +--- + +## v4.1.7 (2024-11-21) ### Enhancements diff --git a/netbox/project-static/dist/graphiql/graphiql.min.js b/netbox/project-static/dist/graphiql/graphiql.min.js index 862ce3a80..03d4ac1e1 100644 --- a/netbox/project-static/dist/graphiql/graphiql.min.js +++ b/netbox/project-static/dist/graphiql/graphiql.min.js @@ -22986,17 +22986,79 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GraphQLError = void 0; +exports.formatError = formatError; +exports.printError = printError; var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _location = __webpack_require__(/*! ../language/location.mjs */ "../../../node_modules/graphql/language/location.mjs"); var _printLocation = __webpack_require__(/*! ../language/printLocation.mjs */ "../../../node_modules/graphql/language/printLocation.mjs"); +function toNormalizedOptions(args) { + const firstArg = args[0]; + if (firstArg == null || 'kind' in firstArg || 'length' in firstArg) { + return { + nodes: firstArg, + source: args[1], + positions: args[2], + path: args[3], + originalError: args[4], + extensions: args[5] + }; + } + return firstArg; +} /** * A GraphQLError describes an Error found during the parse, validate, or * execute phases of performing a GraphQL operation. In addition to a message * and stack trace, it also includes information about the locations in a * GraphQL document and/or execution result that correspond to the Error. */ + class GraphQLError extends Error { - constructor(message, options = {}) { + /** + * An array of `{ line, column }` locations within the source GraphQL document + * which correspond to this error. + * + * Errors during validation often contain multiple locations, for example to + * point out two things with the same name. Errors during execution include a + * single location, the field which produced the error. + * + * Enumerable, and appears in the result of JSON.stringify(). + */ + + /** + * An array describing the JSON-path into the execution response which + * corresponds to this error. Only included for errors during execution. + * + * Enumerable, and appears in the result of JSON.stringify(). + */ + + /** + * An array of GraphQL AST Nodes corresponding to this error. + */ + + /** + * The source GraphQL document for the first location of this error. + * + * Note that if this Error represents more than one node, the source may not + * represent nodes after the first node. + */ + + /** + * An array of character offsets within the source GraphQL document + * which correspond to this error. + */ + + /** + * The original error thrown from a field resolver during execution. + */ + + /** + * Extension fields to add to the formatted error. + */ + + /** + * @deprecated Please use the `GraphQLErrorOptions` constructor overload instead. + */ + constructor(message, ...rawArgs) { var _this$nodes, _nodeLocations$, _ref; const { nodes, @@ -23005,22 +23067,22 @@ class GraphQLError extends Error { path, originalError, extensions - } = options; + } = toNormalizedOptions(rawArgs); super(message); this.name = 'GraphQLError'; this.path = path !== null && path !== void 0 ? path : undefined; - this.originalError = originalError !== null && originalError !== void 0 ? originalError : undefined; - // Compute list of blame nodes. + this.originalError = originalError !== null && originalError !== void 0 ? originalError : undefined; // Compute list of blame nodes. + this.nodes = undefinedIfEmpty(Array.isArray(nodes) ? nodes : nodes ? [nodes] : undefined); - const nodeLocations = undefinedIfEmpty((_this$nodes = this.nodes) === null || _this$nodes === void 0 ? void 0 : _this$nodes.map(node => node.loc).filter(loc => loc != null)); - // Compute locations in the source for the given nodes/positions. + const nodeLocations = undefinedIfEmpty((_this$nodes = this.nodes) === null || _this$nodes === void 0 ? void 0 : _this$nodes.map(node => node.loc).filter(loc => loc != null)); // Compute locations in the source for the given nodes/positions. + this.source = source !== null && source !== void 0 ? source : nodeLocations === null || nodeLocations === void 0 ? void 0 : (_nodeLocations$ = nodeLocations[0]) === null || _nodeLocations$ === void 0 ? void 0 : _nodeLocations$.source; this.positions = positions !== null && positions !== void 0 ? positions : nodeLocations === null || nodeLocations === void 0 ? void 0 : nodeLocations.map(loc => loc.start); this.locations = positions && source ? positions.map(pos => (0, _location.getLocation)(source, pos)) : nodeLocations === null || nodeLocations === void 0 ? void 0 : nodeLocations.map(loc => (0, _location.getLocation)(loc.source, loc.start)); const originalExtensions = (0, _isObjectLike.isObjectLike)(originalError === null || originalError === void 0 ? void 0 : originalError.extensions) ? originalError === null || originalError === void 0 ? void 0 : originalError.extensions : undefined; - this.extensions = (_ref = extensions !== null && extensions !== void 0 ? extensions : originalExtensions) !== null && _ref !== void 0 ? _ref : Object.create(null); - // Only properties prescribed by the spec should be enumerable. + this.extensions = (_ref = extensions !== null && extensions !== void 0 ? extensions : originalExtensions) !== null && _ref !== void 0 ? _ref : Object.create(null); // Only properties prescribed by the spec should be enumerable. // Keep the rest as non-enumerable. + Object.defineProperties(this, { message: { writable: true, @@ -23041,17 +23103,18 @@ class GraphQLError extends Error { originalError: { enumerable: false } - }); - // Include (non-enumerable) stack trace. + }); // Include (non-enumerable) stack trace. + /* c8 ignore start */ // FIXME: https://github.com/graphql/graphql-js/issues/2317 - if ((originalError === null || originalError === void 0 ? void 0 : originalError.stack) != null) { + + if (originalError !== null && originalError !== void 0 && originalError.stack) { Object.defineProperty(this, 'stack', { value: originalError.stack, writable: true, configurable: true }); - } else if (Error.captureStackTrace != null) { + } else if (Error.captureStackTrace) { Error.captureStackTrace(this, GraphQLError); } else { Object.defineProperty(this, 'stack', { @@ -23100,6 +23163,29 @@ exports.GraphQLError = GraphQLError; function undefinedIfEmpty(array) { return array === undefined || array.length === 0 ? undefined : array; } +/** + * See: https://spec.graphql.org/draft/#sec-Errors + */ + +/** + * Prints a GraphQLError to a string, representing useful location information + * about the error's position in the source. + * + * @deprecated Please use `error.toString` instead. Will be removed in v17 + */ +function printError(error) { + return error.toString(); +} +/** + * Given a GraphQLError, format it according to the rules described by the + * Response Format, Errors section of the GraphQL Specification. + * + * @deprecated Please use `error.toJSON` instead. Will be removed in v17 + */ + +function formatError(error) { + return error.toJSON(); +} /***/ }), @@ -23120,12 +23206,24 @@ Object.defineProperty(exports, "GraphQLError", ({ return _GraphQLError.GraphQLError; } })); +Object.defineProperty(exports, "formatError", ({ + enumerable: true, + get: function () { + return _GraphQLError.formatError; + } +})); Object.defineProperty(exports, "locatedError", ({ enumerable: true, get: function () { return _locatedError.locatedError; } })); +Object.defineProperty(exports, "printError", ({ + enumerable: true, + get: function () { + return _GraphQLError.printError; + } +})); Object.defineProperty(exports, "syntaxError", ({ enumerable: true, get: function () { @@ -23157,15 +23255,16 @@ var _GraphQLError = __webpack_require__(/*! ./GraphQLError.mjs */ "../../../node * GraphQL operation, produce a new GraphQLError aware of the location in the * document responsible for the original Error. */ + function locatedError(rawOriginalError, nodes, path) { - var _originalError$nodes; - const originalError = (0, _toError.toError)(rawOriginalError); - // Note: this uses a brand-check to support GraphQL errors originating from other contexts. + var _nodes; + const originalError = (0, _toError.toError)(rawOriginalError); // Note: this uses a brand-check to support GraphQL errors originating from other contexts. + if (isLocatedGraphQLError(originalError)) { return originalError; } return new _GraphQLError.GraphQLError(originalError.message, { - nodes: (_originalError$nodes = originalError.nodes) !== null && _originalError$nodes !== void 0 ? _originalError$nodes : nodes, + nodes: (_nodes = originalError.nodes) !== null && _nodes !== void 0 ? _nodes : nodes, source: originalError.source, positions: originalError.positions, path, @@ -23195,6 +23294,7 @@ var _GraphQLError = __webpack_require__(/*! ./GraphQLError.mjs */ "../../../node * Produces a GraphQLError representing a syntax error, containing useful * descriptive information about the syntax error's position in the source. */ + function syntaxError(source, position, description) { return new _GraphQLError.GraphQLError(`Syntax Error: ${description}`, { source, @@ -23204,613 +23304,6 @@ function syntaxError(source, position, description) { /***/ }), -/***/ "../../../node_modules/graphql/execution/IncrementalGraph.mjs": -/*!********************************************************************!*\ - !*** ../../../node_modules/graphql/execution/IncrementalGraph.mjs ***! - \********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.IncrementalGraph = void 0; -var _BoxedPromiseOrValue = __webpack_require__(/*! ../jsutils/BoxedPromiseOrValue.mjs */ "../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs"); -var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _isPromise = __webpack_require__(/*! ../jsutils/isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); -var _promiseWithResolvers = __webpack_require__(/*! ../jsutils/promiseWithResolvers.mjs */ "../../../node_modules/graphql/jsutils/promiseWithResolvers.mjs"); -var _types = __webpack_require__(/*! ./types.mjs */ "../../../node_modules/graphql/execution/types.mjs"); -/** - * @internal - */ -class IncrementalGraph { - constructor() { - this._rootNodes = new Set(); - this._completedQueue = []; - this._nextQueue = []; - } - getNewRootNodes(incrementalDataRecords) { - const initialResultChildren = new Set(); - this._addIncrementalDataRecords(incrementalDataRecords, undefined, initialResultChildren); - return this._promoteNonEmptyToRoot(initialResultChildren); - } - addCompletedSuccessfulExecutionGroup(successfulExecutionGroup) { - for (const deferredFragmentRecord of successfulExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - deferredFragmentRecord.pendingExecutionGroups.delete(successfulExecutionGroup.pendingExecutionGroup); - deferredFragmentRecord.successfulExecutionGroups.add(successfulExecutionGroup); - } - const incrementalDataRecords = successfulExecutionGroup.incrementalDataRecords; - if (incrementalDataRecords !== undefined) { - this._addIncrementalDataRecords(incrementalDataRecords, successfulExecutionGroup.pendingExecutionGroup.deferredFragmentRecords); - } - } - *currentCompletedBatch() { - let completed; - while ((completed = this._completedQueue.shift()) !== undefined) { - yield completed; - } - if (this._rootNodes.size === 0) { - for (const resolve of this._nextQueue) { - resolve(undefined); - } - } - } - nextCompletedBatch() { - const { - promise, - resolve - } = (0, _promiseWithResolvers.promiseWithResolvers)(); - this._nextQueue.push(resolve); - return promise; - } - abort() { - for (const resolve of this._nextQueue) { - resolve(undefined); - } - } - hasNext() { - return this._rootNodes.size > 0; - } - completeDeferredFragment(deferredFragmentRecord) { - if (!this._rootNodes.has(deferredFragmentRecord) || deferredFragmentRecord.pendingExecutionGroups.size > 0) { - return; - } - const successfulExecutionGroups = Array.from(deferredFragmentRecord.successfulExecutionGroups); - this._removeRootNode(deferredFragmentRecord); - for (const successfulExecutionGroup of successfulExecutionGroups) { - for (const otherDeferredFragmentRecord of successfulExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - otherDeferredFragmentRecord.successfulExecutionGroups.delete(successfulExecutionGroup); - } - } - const newRootNodes = this._promoteNonEmptyToRoot(deferredFragmentRecord.children); - return { - newRootNodes, - successfulExecutionGroups - }; - } - removeDeferredFragment(deferredFragmentRecord) { - if (!this._rootNodes.has(deferredFragmentRecord)) { - return false; - } - this._removeRootNode(deferredFragmentRecord); - return true; - } - removeStream(streamRecord) { - this._removeRootNode(streamRecord); - } - _removeRootNode(deliveryGroup) { - this._rootNodes.delete(deliveryGroup); - } - _addIncrementalDataRecords(incrementalDataRecords, parents, initialResultChildren) { - for (const incrementalDataRecord of incrementalDataRecords) { - if ((0, _types.isPendingExecutionGroup)(incrementalDataRecord)) { - for (const deferredFragmentRecord of incrementalDataRecord.deferredFragmentRecords) { - this._addDeferredFragment(deferredFragmentRecord, initialResultChildren); - deferredFragmentRecord.pendingExecutionGroups.add(incrementalDataRecord); - } - if (this._completesRootNode(incrementalDataRecord)) { - this._onExecutionGroup(incrementalDataRecord); - } - } else if (parents === undefined) { - initialResultChildren !== undefined || (0, _invariant.invariant)(false); - initialResultChildren.add(incrementalDataRecord); - } else { - for (const parent of parents) { - this._addDeferredFragment(parent, initialResultChildren); - parent.children.add(incrementalDataRecord); - } - } - } - } - _promoteNonEmptyToRoot(maybeEmptyNewRootNodes) { - const newRootNodes = []; - for (const node of maybeEmptyNewRootNodes) { - if ((0, _types.isDeferredFragmentRecord)(node)) { - if (node.pendingExecutionGroups.size > 0) { - for (const pendingExecutionGroup of node.pendingExecutionGroups) { - if (!this._completesRootNode(pendingExecutionGroup)) { - this._onExecutionGroup(pendingExecutionGroup); - } - } - this._rootNodes.add(node); - newRootNodes.push(node); - continue; - } - for (const child of node.children) { - maybeEmptyNewRootNodes.add(child); - } - } else { - this._rootNodes.add(node); - newRootNodes.push(node); - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this._onStreamItems(node); - } - } - return newRootNodes; - } - _completesRootNode(pendingExecutionGroup) { - return pendingExecutionGroup.deferredFragmentRecords.some(deferredFragmentRecord => this._rootNodes.has(deferredFragmentRecord)); - } - _addDeferredFragment(deferredFragmentRecord, initialResultChildren) { - if (this._rootNodes.has(deferredFragmentRecord)) { - return; - } - const parent = deferredFragmentRecord.parent; - if (parent === undefined) { - initialResultChildren !== undefined || (0, _invariant.invariant)(false); - initialResultChildren.add(deferredFragmentRecord); - return; - } - parent.children.add(deferredFragmentRecord); - this._addDeferredFragment(parent, initialResultChildren); - } - _onExecutionGroup(pendingExecutionGroup) { - let completedExecutionGroup = pendingExecutionGroup.result; - if (!(completedExecutionGroup instanceof _BoxedPromiseOrValue.BoxedPromiseOrValue)) { - completedExecutionGroup = completedExecutionGroup(); - } - const value = completedExecutionGroup.value; - if ((0, _isPromise.isPromise)(value)) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - value.then(resolved => this._enqueue(resolved)); - } else { - this._enqueue(value); - } - } - async _onStreamItems(streamRecord) { - let items = []; - let errors = []; - let incrementalDataRecords = []; - const streamItemQueue = streamRecord.streamItemQueue; - let streamItemRecord; - while ((streamItemRecord = streamItemQueue.shift()) !== undefined) { - let result = streamItemRecord instanceof _BoxedPromiseOrValue.BoxedPromiseOrValue ? streamItemRecord.value : streamItemRecord().value; - if ((0, _isPromise.isPromise)(result)) { - if (items.length > 0) { - this._enqueue({ - streamRecord, - result: - // TODO add additional test case or rework for coverage - errors.length > 0 /* c8 ignore start */ ? { - items, - errors - } /* c8 ignore stop */ : { - items - }, - incrementalDataRecords - }); - items = []; - errors = []; - incrementalDataRecords = []; - } - // eslint-disable-next-line no-await-in-loop - result = await result; - // wait an additional tick to coalesce resolving additional promises - // within the queue - // eslint-disable-next-line no-await-in-loop - await Promise.resolve(); - } - if (result.item === undefined) { - if (items.length > 0) { - this._enqueue({ - streamRecord, - result: errors.length > 0 ? { - items, - errors - } : { - items - }, - incrementalDataRecords - }); - } - this._enqueue(result.errors === undefined ? { - streamRecord - } : { - streamRecord, - errors: result.errors - }); - return; - } - items.push(result.item); - if (result.errors !== undefined) { - errors.push(...result.errors); - } - if (result.incrementalDataRecords !== undefined) { - incrementalDataRecords.push(...result.incrementalDataRecords); - } - } - } - *_yieldCurrentCompletedIncrementalData(first) { - yield first; - yield* this.currentCompletedBatch(); - } - _enqueue(completed) { - const next = this._nextQueue.shift(); - if (next !== undefined) { - next(this._yieldCurrentCompletedIncrementalData(completed)); - return; - } - this._completedQueue.push(completed); - } -} -exports.IncrementalGraph = IncrementalGraph; - -/***/ }), - -/***/ "../../../node_modules/graphql/execution/IncrementalPublisher.mjs": -/*!************************************************************************!*\ - !*** ../../../node_modules/graphql/execution/IncrementalPublisher.mjs ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.buildIncrementalResponse = buildIncrementalResponse; -var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _Path = __webpack_require__(/*! ../jsutils/Path.mjs */ "../../../node_modules/graphql/jsutils/Path.mjs"); -var _IncrementalGraph = __webpack_require__(/*! ./IncrementalGraph.mjs */ "../../../node_modules/graphql/execution/IncrementalGraph.mjs"); -var _types = __webpack_require__(/*! ./types.mjs */ "../../../node_modules/graphql/execution/types.mjs"); -function buildIncrementalResponse(context, result, errors, incrementalDataRecords) { - const incrementalPublisher = new IncrementalPublisher(context); - return incrementalPublisher.buildResponse(result, errors, incrementalDataRecords); -} -/** - * This class is used to publish incremental results to the client, enabling semi-concurrent - * execution while preserving result order. - * - * @internal - */ -class IncrementalPublisher { - constructor(context) { - this._context = context; - this._nextId = 0; - this._incrementalGraph = new _IncrementalGraph.IncrementalGraph(); - } - buildResponse(data, errors, incrementalDataRecords) { - const newRootNodes = this._incrementalGraph.getNewRootNodes(incrementalDataRecords); - const pending = this._toPendingResults(newRootNodes); - const initialResult = errors === undefined ? { - data, - pending, - hasNext: true - } : { - errors, - data, - pending, - hasNext: true - }; - return { - initialResult, - subsequentResults: this._subscribe() - }; - } - _toPendingResults(newRootNodes) { - const pendingResults = []; - for (const node of newRootNodes) { - const id = String(this._getNextId()); - node.id = id; - const pendingResult = { - id, - path: (0, _Path.pathToArray)(node.path) - }; - if (node.label !== undefined) { - pendingResult.label = node.label; - } - pendingResults.push(pendingResult); - } - return pendingResults; - } - _getNextId() { - return String(this._nextId++); - } - _subscribe() { - let isDone = false; - const _next = async () => { - if (isDone) { - await this._returnAsyncIteratorsIgnoringErrors(); - return { - value: undefined, - done: true - }; - } - const context = { - pending: [], - incremental: [], - completed: [] - }; - let batch = this._incrementalGraph.currentCompletedBatch(); - do { - for (const completedResult of batch) { - this._handleCompletedIncrementalData(completedResult, context); - } - const { - incremental, - completed - } = context; - if (incremental.length > 0 || completed.length > 0) { - const hasNext = this._incrementalGraph.hasNext(); - if (!hasNext) { - isDone = true; - } - const subsequentIncrementalExecutionResult = { - hasNext - }; - const pending = context.pending; - if (pending.length > 0) { - subsequentIncrementalExecutionResult.pending = pending; - } - if (incremental.length > 0) { - subsequentIncrementalExecutionResult.incremental = incremental; - } - if (completed.length > 0) { - subsequentIncrementalExecutionResult.completed = completed; - } - return { - value: subsequentIncrementalExecutionResult, - done: false - }; - } - // eslint-disable-next-line no-await-in-loop - batch = await this._incrementalGraph.nextCompletedBatch(); - } while (batch !== undefined); - await this._returnAsyncIteratorsIgnoringErrors(); - return { - value: undefined, - done: true - }; - }; - const _return = async () => { - isDone = true; - this._incrementalGraph.abort(); - await this._returnAsyncIterators(); - return { - value: undefined, - done: true - }; - }; - const _throw = async error => { - isDone = true; - this._incrementalGraph.abort(); - await this._returnAsyncIterators(); - return Promise.reject(error); - }; - return { - [Symbol.asyncIterator]() { - return this; - }, - next: _next, - return: _return, - throw: _throw - }; - } - _handleCompletedIncrementalData(completedIncrementalData, context) { - if ((0, _types.isCompletedExecutionGroup)(completedIncrementalData)) { - this._handleCompletedExecutionGroup(completedIncrementalData, context); - } else { - this._handleCompletedStreamItems(completedIncrementalData, context); - } - } - _handleCompletedExecutionGroup(completedExecutionGroup, context) { - if ((0, _types.isFailedExecutionGroup)(completedExecutionGroup)) { - for (const deferredFragmentRecord of completedExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - const id = deferredFragmentRecord.id; - if (!this._incrementalGraph.removeDeferredFragment(deferredFragmentRecord)) { - // This can occur if multiple deferred grouped field sets error for a fragment. - continue; - } - id !== undefined || (0, _invariant.invariant)(false); - context.completed.push({ - id, - errors: completedExecutionGroup.errors - }); - } - return; - } - this._incrementalGraph.addCompletedSuccessfulExecutionGroup(completedExecutionGroup); - for (const deferredFragmentRecord of completedExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - const completion = this._incrementalGraph.completeDeferredFragment(deferredFragmentRecord); - if (completion === undefined) { - continue; - } - const id = deferredFragmentRecord.id; - id !== undefined || (0, _invariant.invariant)(false); - const incremental = context.incremental; - const { - newRootNodes, - successfulExecutionGroups - } = completion; - context.pending.push(...this._toPendingResults(newRootNodes)); - for (const successfulExecutionGroup of successfulExecutionGroups) { - const { - bestId, - subPath - } = this._getBestIdAndSubPath(id, deferredFragmentRecord, successfulExecutionGroup); - const incrementalEntry = { - ...successfulExecutionGroup.result, - id: bestId - }; - if (subPath !== undefined) { - incrementalEntry.subPath = subPath; - } - incremental.push(incrementalEntry); - } - context.completed.push({ - id - }); - } - } - _handleCompletedStreamItems(streamItemsResult, context) { - const streamRecord = streamItemsResult.streamRecord; - const id = streamRecord.id; - id !== undefined || (0, _invariant.invariant)(false); - if (streamItemsResult.errors !== undefined) { - context.completed.push({ - id, - errors: streamItemsResult.errors - }); - this._incrementalGraph.removeStream(streamRecord); - if ((0, _types.isCancellableStreamRecord)(streamRecord)) { - this._context.cancellableStreams !== undefined || (0, _invariant.invariant)(false); - this._context.cancellableStreams.delete(streamRecord); - streamRecord.earlyReturn().catch(() => { - /* c8 ignore next 1 */ - // ignore error - }); - } - } else if (streamItemsResult.result === undefined) { - context.completed.push({ - id - }); - this._incrementalGraph.removeStream(streamRecord); - if ((0, _types.isCancellableStreamRecord)(streamRecord)) { - this._context.cancellableStreams !== undefined || (0, _invariant.invariant)(false); - this._context.cancellableStreams.delete(streamRecord); - } - } else { - const incrementalEntry = { - id, - ...streamItemsResult.result - }; - context.incremental.push(incrementalEntry); - const incrementalDataRecords = streamItemsResult.incrementalDataRecords; - if (incrementalDataRecords !== undefined) { - const newRootNodes = this._incrementalGraph.getNewRootNodes(incrementalDataRecords); - context.pending.push(...this._toPendingResults(newRootNodes)); - } - } - } - _getBestIdAndSubPath(initialId, initialDeferredFragmentRecord, completedExecutionGroup) { - let maxLength = (0, _Path.pathToArray)(initialDeferredFragmentRecord.path).length; - let bestId = initialId; - for (const deferredFragmentRecord of completedExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - if (deferredFragmentRecord === initialDeferredFragmentRecord) { - continue; - } - const id = deferredFragmentRecord.id; - // TODO: add test case for when an fragment has not been released, but might be processed for the shortest path. - /* c8 ignore next 3 */ - if (id === undefined) { - continue; - } - const fragmentPath = (0, _Path.pathToArray)(deferredFragmentRecord.path); - const length = fragmentPath.length; - if (length > maxLength) { - maxLength = length; - bestId = id; - } - } - const subPath = completedExecutionGroup.path.slice(maxLength); - return { - bestId, - subPath: subPath.length > 0 ? subPath : undefined - }; - } - async _returnAsyncIterators() { - const cancellableStreams = this._context.cancellableStreams; - if (cancellableStreams === undefined) { - return; - } - const promises = []; - for (const streamRecord of cancellableStreams) { - if (streamRecord.earlyReturn !== undefined) { - promises.push(streamRecord.earlyReturn()); - } - } - await Promise.all(promises); - } - async _returnAsyncIteratorsIgnoringErrors() { - await this._returnAsyncIterators().catch(() => { - // Ignore errors - }); - } -} - -/***/ }), - -/***/ "../../../node_modules/graphql/execution/buildExecutionPlan.mjs": -/*!**********************************************************************!*\ - !*** ../../../node_modules/graphql/execution/buildExecutionPlan.mjs ***! - \**********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.buildExecutionPlan = buildExecutionPlan; -var _getBySet = __webpack_require__(/*! ../jsutils/getBySet.mjs */ "../../../node_modules/graphql/jsutils/getBySet.mjs"); -var _isSameSet = __webpack_require__(/*! ../jsutils/isSameSet.mjs */ "../../../node_modules/graphql/jsutils/isSameSet.mjs"); -function buildExecutionPlan(originalGroupedFieldSet, parentDeferUsages = new Set()) { - const groupedFieldSet = new Map(); - const newGroupedFieldSets = new Map(); - for (const [responseKey, fieldGroup] of originalGroupedFieldSet) { - const filteredDeferUsageSet = getFilteredDeferUsageSet(fieldGroup); - if ((0, _isSameSet.isSameSet)(filteredDeferUsageSet, parentDeferUsages)) { - groupedFieldSet.set(responseKey, fieldGroup); - continue; - } - let newGroupedFieldSet = (0, _getBySet.getBySet)(newGroupedFieldSets, filteredDeferUsageSet); - if (newGroupedFieldSet === undefined) { - newGroupedFieldSet = new Map(); - newGroupedFieldSets.set(filteredDeferUsageSet, newGroupedFieldSet); - } - newGroupedFieldSet.set(responseKey, fieldGroup); - } - return { - groupedFieldSet, - newGroupedFieldSets - }; -} -function getFilteredDeferUsageSet(fieldGroup) { - const filteredDeferUsageSet = new Set(); - for (const fieldDetails of fieldGroup) { - const deferUsage = fieldDetails.deferUsage; - if (deferUsage === undefined) { - filteredDeferUsageSet.clear(); - return filteredDeferUsageSet; - } - filteredDeferUsageSet.add(deferUsage); - } - for (const deferUsage of filteredDeferUsageSet) { - let parentDeferUsage = deferUsage.parentDeferUsage; - while (parentDeferUsage !== undefined) { - if (filteredDeferUsageSet.has(parentDeferUsage)) { - filteredDeferUsageSet.delete(deferUsage); - break; - } - parentDeferUsage = parentDeferUsage.parentDeferUsage; - } - } - return filteredDeferUsageSet; -} - -/***/ }), - /***/ "../../../node_modules/graphql/execution/collectFields.mjs": /*!*****************************************************************!*\ !*** ../../../node_modules/graphql/execution/collectFields.mjs ***! @@ -23824,9 +23317,6 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.collectFields = collectFields; exports.collectSubfields = collectSubfields; -var _AccumulatorMap = __webpack_require__(/*! ../jsutils/AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); -var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); @@ -23841,22 +23331,11 @@ var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/gra * * @internal */ -function collectFields(schema, fragments, variableValues, runtimeType, operation) { - const groupedFieldSet = new _AccumulatorMap.AccumulatorMap(); - const newDeferUsages = []; - const context = { - schema, - fragments, - variableValues, - runtimeType, - operation, - visitedFragmentNames: new Set() - }; - collectFieldsImpl(context, operation.selectionSet, groupedFieldSet, newDeferUsages); - return { - groupedFieldSet, - newDeferUsages - }; + +function collectFields(schema, fragments, variableValues, runtimeType, selectionSet) { + const fields = new Map(); + collectFieldsImpl(schema, fragments, variableValues, runtimeType, selectionSet, fields, new Set()); + return fields; } /** * Given an array of field nodes, collects all of the subfields of the passed @@ -23868,38 +23347,18 @@ function collectFields(schema, fragments, variableValues, runtimeType, operation * * @internal */ -// eslint-disable-next-line max-params -function collectSubfields(schema, fragments, variableValues, operation, returnType, fieldGroup) { - const context = { - schema, - fragments, - variableValues, - runtimeType: returnType, - operation, - visitedFragmentNames: new Set() - }; - const subGroupedFieldSet = new _AccumulatorMap.AccumulatorMap(); - const newDeferUsages = []; - for (const fieldDetail of fieldGroup) { - const node = fieldDetail.node; + +function collectSubfields(schema, fragments, variableValues, returnType, fieldNodes) { + const subFieldNodes = new Map(); + const visitedFragmentNames = new Set(); + for (const node of fieldNodes) { if (node.selectionSet) { - collectFieldsImpl(context, node.selectionSet, subGroupedFieldSet, newDeferUsages, fieldDetail.deferUsage); + collectFieldsImpl(schema, fragments, variableValues, returnType, node.selectionSet, subFieldNodes, visitedFragmentNames); } } - return { - groupedFieldSet: subGroupedFieldSet, - newDeferUsages - }; + return subFieldNodes; } -function collectFieldsImpl(context, selectionSet, groupedFieldSet, newDeferUsages, deferUsage) { - const { - schema, - fragments, - variableValues, - runtimeType, - operation, - visitedFragmentNames - } = context; +function collectFieldsImpl(schema, fragments, variableValues, runtimeType, selectionSet, fields, visitedFragmentNames) { for (const selection of selectionSet.selections) { switch (selection.kind) { case _kinds.Kind.FIELD: @@ -23907,10 +23366,13 @@ function collectFieldsImpl(context, selectionSet, groupedFieldSet, newDeferUsage if (!shouldIncludeNode(variableValues, selection)) { continue; } - groupedFieldSet.add(getFieldEntryKey(selection), { - node: selection, - deferUsage - }); + const name = getFieldEntryKey(selection); + const fieldList = fields.get(name); + if (fieldList !== undefined) { + fieldList.push(selection); + } else { + fields.set(name, [selection]); + } break; } case _kinds.Kind.INLINE_FRAGMENT: @@ -23918,61 +23380,31 @@ function collectFieldsImpl(context, selectionSet, groupedFieldSet, newDeferUsage if (!shouldIncludeNode(variableValues, selection) || !doesFragmentConditionMatch(schema, selection, runtimeType)) { continue; } - const newDeferUsage = getDeferUsage(operation, variableValues, selection, deferUsage); - if (!newDeferUsage) { - collectFieldsImpl(context, selection.selectionSet, groupedFieldSet, newDeferUsages, deferUsage); - } else { - newDeferUsages.push(newDeferUsage); - collectFieldsImpl(context, selection.selectionSet, groupedFieldSet, newDeferUsages, newDeferUsage); - } + collectFieldsImpl(schema, fragments, variableValues, runtimeType, selection.selectionSet, fields, visitedFragmentNames); break; } case _kinds.Kind.FRAGMENT_SPREAD: { const fragName = selection.name.value; - const newDeferUsage = getDeferUsage(operation, variableValues, selection, deferUsage); - if (!newDeferUsage && (visitedFragmentNames.has(fragName) || !shouldIncludeNode(variableValues, selection))) { + if (visitedFragmentNames.has(fragName) || !shouldIncludeNode(variableValues, selection)) { continue; } + visitedFragmentNames.add(fragName); const fragment = fragments[fragName]; - if (fragment == null || !doesFragmentConditionMatch(schema, fragment, runtimeType)) { + if (!fragment || !doesFragmentConditionMatch(schema, fragment, runtimeType)) { continue; } - if (!newDeferUsage) { - visitedFragmentNames.add(fragName); - collectFieldsImpl(context, fragment.selectionSet, groupedFieldSet, newDeferUsages, deferUsage); - } else { - newDeferUsages.push(newDeferUsage); - collectFieldsImpl(context, fragment.selectionSet, groupedFieldSet, newDeferUsages, newDeferUsage); - } + collectFieldsImpl(schema, fragments, variableValues, runtimeType, fragment.selectionSet, fields, visitedFragmentNames); break; } } } } -/** - * Returns an object containing the `@defer` arguments if a field should be - * deferred based on the experimental flag, defer directive present and - * not disabled by the "if" argument. - */ -function getDeferUsage(operation, variableValues, node, parentDeferUsage) { - const defer = (0, _values.getDirectiveValues)(_directives.GraphQLDeferDirective, node, variableValues); - if (!defer) { - return; - } - if (defer.if === false) { - return; - } - operation.operation !== _ast.OperationTypeNode.SUBSCRIPTION || (0, _invariant.invariant)(false, '`@defer` directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`.'); - return { - label: typeof defer.label === 'string' ? defer.label : undefined, - parentDeferUsage - }; -} /** * Determines if a field should be included based on the `@include` and `@skip` * directives, where `@skip` has higher precedence than `@include`. */ + function shouldIncludeNode(variableValues, node) { const skip = (0, _values.getDirectiveValues)(_directives.GraphQLSkipDirective, node, variableValues); if ((skip === null || skip === void 0 ? void 0 : skip.if) === true) { @@ -23987,6 +23419,7 @@ function shouldIncludeNode(variableValues, node) { /** * Determines if a fragment is applicable to the given type. */ + function doesFragmentConditionMatch(schema, fragment, type) { const typeConditionNode = fragment.typeCondition; if (!typeConditionNode) { @@ -24004,6 +23437,7 @@ function doesFragmentConditionMatch(schema, fragment, type) { /** * Implements the logic to compute the key of a given field's entry */ + function getFieldEntryKey(node) { return node.alias ? node.alias.value : node.name.value; } @@ -24021,18 +23455,16 @@ function getFieldEntryKey(node) { Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.assertValidExecutionArguments = assertValidExecutionArguments; exports.buildExecutionContext = buildExecutionContext; exports.buildResolveInfo = buildResolveInfo; -exports.createSourceEventStream = createSourceEventStream; exports.defaultTypeResolver = exports.defaultFieldResolver = void 0; exports.execute = execute; exports.executeSync = executeSync; -exports.experimentalExecuteIncrementally = experimentalExecuteIncrementally; -exports.subscribe = subscribe; -var _BoxedPromiseOrValue = __webpack_require__(/*! ../jsutils/BoxedPromiseOrValue.mjs */ "../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs"); +exports.getFieldDef = getFieldDef; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _isAsyncIterable = __webpack_require__(/*! ../jsutils/isAsyncIterable.mjs */ "../../../node_modules/graphql/jsutils/isAsyncIterable.mjs"); var _isIterableObject = __webpack_require__(/*! ../jsutils/isIterableObject.mjs */ "../../../node_modules/graphql/jsutils/isIterableObject.mjs"); var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _isPromise = __webpack_require__(/*! ../jsutils/isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); @@ -24045,25 +23477,44 @@ var _locatedError = __webpack_require__(/*! ../error/locatedError.mjs */ "../../ var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); -var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); +var _introspection = __webpack_require__(/*! ../type/introspection.mjs */ "../../../node_modules/graphql/type/introspection.mjs"); var _validate = __webpack_require__(/*! ../type/validate.mjs */ "../../../node_modules/graphql/type/validate.mjs"); -var _buildExecutionPlan = __webpack_require__(/*! ./buildExecutionPlan.mjs */ "../../../node_modules/graphql/execution/buildExecutionPlan.mjs"); var _collectFields = __webpack_require__(/*! ./collectFields.mjs */ "../../../node_modules/graphql/execution/collectFields.mjs"); -var _IncrementalPublisher = __webpack_require__(/*! ./IncrementalPublisher.mjs */ "../../../node_modules/graphql/execution/IncrementalPublisher.mjs"); -var _mapAsyncIterable = __webpack_require__(/*! ./mapAsyncIterable.mjs */ "../../../node_modules/graphql/execution/mapAsyncIterable.mjs"); -var _types = __webpack_require__(/*! ./types.mjs */ "../../../node_modules/graphql/execution/types.mjs"); var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/graphql/execution/values.mjs"); -/* eslint-disable max-params */ -// This file contains a lot of such errors but we plan to refactor it anyway -// so just disable it for entire file. /** * A memoized collection of relevant subfields with regard to the return * type. Memoizing ensures the subfields are not repeatedly calculated, which * saves overhead when resolving lists of values. */ -const collectSubfields = (0, _memoize.memoize3)((exeContext, returnType, fieldGroup) => (0, _collectFields.collectSubfields)(exeContext.schema, exeContext.fragments, exeContext.variableValues, exeContext.operation, returnType, fieldGroup)); -const UNEXPECTED_EXPERIMENTAL_DIRECTIVES = 'The provided schema unexpectedly contains experimental directives (@defer or @stream). These directives may only be utilized if experimental execution features are explicitly enabled.'; -const UNEXPECTED_MULTIPLE_PAYLOADS = 'Executing this GraphQL operation would unexpectedly produce multiple payloads (due to @defer or @stream directive)'; + +const collectSubfields = (0, _memoize.memoize3)((exeContext, returnType, fieldNodes) => (0, _collectFields.collectSubfields)(exeContext.schema, exeContext.fragments, exeContext.variableValues, returnType, fieldNodes)); +/** + * Terminology + * + * "Definitions" are the generic name for top-level statements in the document. + * Examples of this include: + * 1) Operations (such as a query) + * 2) Fragments + * + * "Operations" are a generic name for requests in the document. + * Examples of this include: + * 1) query, + * 2) mutation + * + * "Selections" are the definitions that can appear legally and at + * single level of the query. These include: + * 1) field references e.g `a` + * 2) fragment "spreads" e.g. `...c` + * 3) inline fragment "spreads" e.g. `...on Type { a }` + */ + +/** + * Data that must be available at all points during query execution. + * + * Namely, schema of the type system that is currently executing, + * and the fragments defined in the query document + */ + /** * Implements the "Executing requests" section of the GraphQL specification. * @@ -24073,177 +23524,105 @@ const UNEXPECTED_MULTIPLE_PAYLOADS = 'Executing this GraphQL operation would une * * If the arguments to this function do not result in a legal execution context, * a GraphQLError will be thrown immediately explaining the invalid input. - * - * This function does not support incremental delivery (`@defer` and `@stream`). - * If an operation which would defer or stream data is executed with this - * function, it will throw or return a rejected promise. - * Use `experimentalExecuteIncrementally` if you want to support incremental - * delivery. */ function execute(args) { - if (args.schema.getDirective('defer') || args.schema.getDirective('stream')) { - throw new Error(UNEXPECTED_EXPERIMENTAL_DIRECTIVES); - } - const result = experimentalExecuteIncrementally(args); - if (!(0, _isPromise.isPromise)(result)) { - if ('initialResult' in result) { - // This can happen if the operation contains @defer or @stream directives - // and is not validated prior to execution - throw new Error(UNEXPECTED_MULTIPLE_PAYLOADS); - } - return result; - } - return result.then(incrementalResult => { - if ('initialResult' in incrementalResult) { - // This can happen if the operation contains @defer or @stream directives - // and is not validated prior to execution - throw new Error(UNEXPECTED_MULTIPLE_PAYLOADS); - } - return incrementalResult; - }); -} -/** - * Implements the "Executing requests" section of the GraphQL specification, - * including `@defer` and `@stream` as proposed in - * https://github.com/graphql/graphql-spec/pull/742 - * - * This function returns a Promise of an ExperimentalIncrementalExecutionResults - * object. This object either consists of a single ExecutionResult, or an - * object containing an `initialResult` and a stream of `subsequentResults`. - * - * If the arguments to this function do not result in a legal execution context, - * a GraphQLError will be thrown immediately explaining the invalid input. - */ -function experimentalExecuteIncrementally(args) { - // If a valid execution context cannot be created due to incorrect arguments, + // Temporary for v15 to v16 migration. Remove in v17 + arguments.length < 2 || (0, _devAssert.devAssert)(false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.'); + const { + schema, + document, + variableValues, + rootValue + } = args; // If arguments are missing or incorrect, throw an error. + + assertValidExecutionArguments(schema, document, variableValues); // If a valid execution context cannot be created due to incorrect arguments, // a "Response" with only errors is returned. - const exeContext = buildExecutionContext(args); - // Return early errors if execution context failed. + + const exeContext = buildExecutionContext(args); // Return early errors if execution context failed. + if (!('schema' in exeContext)) { return { errors: exeContext }; - } - return executeOperation(exeContext); -} -/** - * Implements the "Executing operations" section of the spec. - * - * Returns a Promise that will eventually resolve to the data described by - * The "Response" section of the GraphQL specification. - * - * If errors are encountered while executing a GraphQL field, only that - * field and its descendants will be omitted, and sibling fields will still - * be executed. An execution which encounters errors will still result in a - * resolved Promise. - * - * Errors from sub-fields of a NonNull type may propagate to the top level, - * at which point we still log the error and null the parent field, which - * in this case is the entire response. - */ -function executeOperation(exeContext) { + } // Return a Promise that will eventually resolve to the data described by + // The "Response" section of the GraphQL specification. + // + // If errors are encountered while executing a GraphQL field, only that + // field and its descendants will be omitted, and sibling fields will still + // be executed. An execution which encounters errors will still result in a + // resolved Promise. + // + // Errors from sub-fields of a NonNull type may propagate to the top level, + // at which point we still log the error and null the parent field, which + // in this case is the entire response. + try { const { - operation, - schema, - fragments, - variableValues, - rootValue + operation } = exeContext; - const rootType = schema.getRootType(operation.operation); - if (rootType == null) { - throw new _GraphQLError.GraphQLError(`Schema is not configured to execute ${operation.operation} operation.`, { - nodes: operation + const result = executeOperation(exeContext, operation, rootValue); + if ((0, _isPromise.isPromise)(result)) { + return result.then(data => buildResponse(data, exeContext.errors), error => { + exeContext.errors.push(error); + return buildResponse(null, exeContext.errors); }); } - const collectedFields = (0, _collectFields.collectFields)(schema, fragments, variableValues, rootType, operation); - let groupedFieldSet = collectedFields.groupedFieldSet; - const newDeferUsages = collectedFields.newDeferUsages; - let graphqlWrappedResult; - if (newDeferUsages.length === 0) { - graphqlWrappedResult = executeRootGroupedFieldSet(exeContext, operation.operation, rootType, rootValue, groupedFieldSet, undefined); - } else { - const executionPlan = (0, _buildExecutionPlan.buildExecutionPlan)(groupedFieldSet); - groupedFieldSet = executionPlan.groupedFieldSet; - const newGroupedFieldSets = executionPlan.newGroupedFieldSets; - const newDeferMap = addNewDeferredFragments(newDeferUsages, new Map()); - graphqlWrappedResult = executeRootGroupedFieldSet(exeContext, operation.operation, rootType, rootValue, groupedFieldSet, newDeferMap); - if (newGroupedFieldSets.size > 0) { - const newPendingExecutionGroups = collectExecutionGroups(exeContext, rootType, rootValue, undefined, undefined, newGroupedFieldSets, newDeferMap); - graphqlWrappedResult = withNewExecutionGroups(graphqlWrappedResult, newPendingExecutionGroups); - } - } - if ((0, _isPromise.isPromise)(graphqlWrappedResult)) { - return graphqlWrappedResult.then(resolved => buildDataResponse(exeContext, resolved[0], resolved[1]), error => ({ - data: null, - errors: withError(exeContext.errors, error) - })); - } - return buildDataResponse(exeContext, graphqlWrappedResult[0], graphqlWrappedResult[1]); + return buildResponse(result, exeContext.errors); } catch (error) { - return { - data: null, - errors: withError(exeContext.errors, error) - }; + exeContext.errors.push(error); + return buildResponse(null, exeContext.errors); } } -function withNewExecutionGroups(result, newPendingExecutionGroups) { - if ((0, _isPromise.isPromise)(result)) { - return result.then(resolved => { - addIncrementalDataRecords(resolved, newPendingExecutionGroups); - return resolved; - }); - } - addIncrementalDataRecords(result, newPendingExecutionGroups); - return result; -} -function addIncrementalDataRecords(graphqlWrappedResult, incrementalDataRecords) { - if (incrementalDataRecords === undefined) { - return; - } - if (graphqlWrappedResult[1] === undefined) { - graphqlWrappedResult[1] = [...incrementalDataRecords]; - } else { - graphqlWrappedResult[1].push(...incrementalDataRecords); - } -} -function withError(errors, error) { - return errors === undefined ? [error] : [...errors, error]; -} -function buildDataResponse(exeContext, data, incrementalDataRecords) { - const errors = exeContext.errors; - if (incrementalDataRecords === undefined) { - return errors !== undefined ? { - errors, - data - } : { - data - }; - } - return (0, _IncrementalPublisher.buildIncrementalResponse)(exeContext, data, errors, incrementalDataRecords); -} /** * Also implements the "Executing requests" section of the GraphQL specification. * However, it guarantees to complete synchronously (or throw an error) assuming * that all field resolvers are also synchronous. */ + function executeSync(args) { - const result = experimentalExecuteIncrementally(args); - // Assert that the execution was synchronous. - if ((0, _isPromise.isPromise)(result) || 'initialResult' in result) { + const result = execute(args); // Assert that the execution was synchronous. + + if ((0, _isPromise.isPromise)(result)) { throw new Error('GraphQL execution failed to complete synchronously.'); } return result; } +/** + * Given a completed execution context and data, build the `{ errors, data }` + * response defined by the "Response" section of the GraphQL specification. + */ + +function buildResponse(data, errors) { + return errors.length === 0 ? { + data + } : { + errors, + data + }; +} +/** + * Essential assertions before executing to provide developer feedback for + * improper use of the GraphQL library. + * + * @internal + */ + +function assertValidExecutionArguments(schema, document, rawVariableValues) { + document || (0, _devAssert.devAssert)(false, 'Must provide document.'); // If the schema used for execution is invalid, throw an error. + + (0, _validate.assertValidSchema)(schema); // Variables, if provided, must be an object. + + rawVariableValues == null || (0, _isObjectLike.isObjectLike)(rawVariableValues) || (0, _devAssert.devAssert)(false, 'Variables must be provided as an Object where each property is a variable value. Perhaps look to see if an unparsed JSON string was provided.'); +} /** * Constructs a ExecutionContext object from the arguments passed to * execute, which we will pass throughout the other execution methods. * * Throws a GraphQLError if a valid execution context cannot be created. * - * TODO: consider no longer exporting this function * @internal */ + function buildExecutionContext(args) { var _definition$name, _operation$variableDe; const { @@ -24255,11 +23634,8 @@ function buildExecutionContext(args) { operationName, fieldResolver, typeResolver, - subscribeFieldResolver, - enableEarlyExecution + subscribeFieldResolver } = args; - // If the schema used for execution is invalid, throw an error. - (0, _validate.assertValidSchema)(schema); let operation; const fragments = Object.create(null); for (const definition of document.definitions) { @@ -24277,8 +23653,7 @@ function buildExecutionContext(args) { case _kinds.Kind.FRAGMENT_DEFINITION: fragments[definition.name.value] = definition; break; - default: - // ignore non-executable definitions + default: // ignore non-executable definitions } } if (!operation) { @@ -24286,9 +23661,10 @@ function buildExecutionContext(args) { return [new _GraphQLError.GraphQLError(`Unknown operation named "${operationName}".`)]; } return [new _GraphQLError.GraphQLError('Must provide an operation.')]; - } - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + } // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const variableDefinitions = (_operation$variableDe = operation.variableDefinitions) !== null && _operation$variableDe !== void 0 ? _operation$variableDe : []; const coercedVariableValues = (0, _values.getVariableValues)(schema, variableDefinitions, rawVariableValues !== null && rawVariableValues !== void 0 ? rawVariableValues : {}, { maxErrors: 50 @@ -24306,100 +23682,91 @@ function buildExecutionContext(args) { fieldResolver: fieldResolver !== null && fieldResolver !== void 0 ? fieldResolver : defaultFieldResolver, typeResolver: typeResolver !== null && typeResolver !== void 0 ? typeResolver : defaultTypeResolver, subscribeFieldResolver: subscribeFieldResolver !== null && subscribeFieldResolver !== void 0 ? subscribeFieldResolver : defaultFieldResolver, - enableEarlyExecution: enableEarlyExecution === true, - errors: undefined, - cancellableStreams: undefined + errors: [] }; } -function buildPerEventExecutionContext(exeContext, payload) { - return { - ...exeContext, - rootValue: payload, - errors: undefined - }; -} -function executeRootGroupedFieldSet(exeContext, operation, rootType, rootValue, groupedFieldSet, deferMap) { - switch (operation) { +/** + * Implements the "Executing operations" section of the spec. + */ + +function executeOperation(exeContext, operation, rootValue) { + const rootType = exeContext.schema.getRootType(operation.operation); + if (rootType == null) { + throw new _GraphQLError.GraphQLError(`Schema is not configured to execute ${operation.operation} operation.`, { + nodes: operation + }); + } + const rootFields = (0, _collectFields.collectFields)(exeContext.schema, exeContext.fragments, exeContext.variableValues, rootType, operation.selectionSet); + const path = undefined; + switch (operation.operation) { case _ast.OperationTypeNode.QUERY: - return executeFields(exeContext, rootType, rootValue, undefined, groupedFieldSet, undefined, deferMap); + return executeFields(exeContext, rootType, rootValue, path, rootFields); case _ast.OperationTypeNode.MUTATION: - return executeFieldsSerially(exeContext, rootType, rootValue, undefined, groupedFieldSet, undefined, deferMap); + return executeFieldsSerially(exeContext, rootType, rootValue, path, rootFields); case _ast.OperationTypeNode.SUBSCRIPTION: // TODO: deprecate `subscribe` and move all logic here // Temporary solution until we finish merging execute and subscribe together - return executeFields(exeContext, rootType, rootValue, undefined, groupedFieldSet, undefined, deferMap); + return executeFields(exeContext, rootType, rootValue, path, rootFields); } } /** * Implements the "Executing selection sets" section of the spec * for fields that must be executed serially. */ -function executeFieldsSerially(exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap) { - return (0, _promiseReduce.promiseReduce)(groupedFieldSet, (graphqlWrappedResult, [responseName, fieldGroup]) => { + +function executeFieldsSerially(exeContext, parentType, sourceValue, path, fields) { + return (0, _promiseReduce.promiseReduce)(fields.entries(), (results, [responseName, fieldNodes]) => { const fieldPath = (0, _Path.addPath)(path, responseName, parentType.name); - const result = executeField(exeContext, parentType, sourceValue, fieldGroup, fieldPath, incrementalContext, deferMap); + const result = executeField(exeContext, parentType, sourceValue, fieldNodes, fieldPath); if (result === undefined) { - return graphqlWrappedResult; + return results; } if ((0, _isPromise.isPromise)(result)) { - return result.then(resolved => { - graphqlWrappedResult[0][responseName] = resolved[0]; - addIncrementalDataRecords(graphqlWrappedResult, resolved[1]); - return graphqlWrappedResult; + return result.then(resolvedResult => { + results[responseName] = resolvedResult; + return results; }); } - graphqlWrappedResult[0][responseName] = result[0]; - addIncrementalDataRecords(graphqlWrappedResult, result[1]); - return graphqlWrappedResult; - }, [Object.create(null), undefined]); + results[responseName] = result; + return results; + }, Object.create(null)); } /** * Implements the "Executing selection sets" section of the spec * for fields that may be executed in parallel. */ -function executeFields(exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap) { + +function executeFields(exeContext, parentType, sourceValue, path, fields) { const results = Object.create(null); - const graphqlWrappedResult = [results, undefined]; let containsPromise = false; try { - for (const [responseName, fieldGroup] of groupedFieldSet) { + for (const [responseName, fieldNodes] of fields.entries()) { const fieldPath = (0, _Path.addPath)(path, responseName, parentType.name); - const result = executeField(exeContext, parentType, sourceValue, fieldGroup, fieldPath, incrementalContext, deferMap); + const result = executeField(exeContext, parentType, sourceValue, fieldNodes, fieldPath); if (result !== undefined) { + results[responseName] = result; if ((0, _isPromise.isPromise)(result)) { - results[responseName] = result.then(resolved => { - addIncrementalDataRecords(graphqlWrappedResult, resolved[1]); - return resolved[0]; - }); containsPromise = true; - } else { - results[responseName] = result[0]; - addIncrementalDataRecords(graphqlWrappedResult, result[1]); } } } } catch (error) { if (containsPromise) { // Ensure that any promises returned by other fields are handled, as they may also reject. - return (0, _promiseForObject.promiseForObject)(results, () => { - /* noop */ - }).finally(() => { + return (0, _promiseForObject.promiseForObject)(results).finally(() => { throw error; }); } throw error; - } - // If there are no promises, we can just return the object and any incrementalDataRecords + } // If there are no promises, we can just return the object + if (!containsPromise) { - return graphqlWrappedResult; - } - // Otherwise, results is a map from field name to the result of resolving that + return results; + } // Otherwise, results is a map from field name to the result of resolving that // field, which is possibly a promise. Return a promise that will return this // same map, but with any promises replaced with the values they resolved to. - return (0, _promiseForObject.promiseForObject)(results, resolved => [resolved, graphqlWrappedResult[1]]); -} -function toNodes(fieldGroup) { - return fieldGroup.map(fieldDetails => fieldDetails.node); + + return (0, _promiseForObject.promiseForObject)(results); } /** * Implements the "Executing fields" section of the spec @@ -24407,49 +23774,51 @@ function toNodes(fieldGroup) { * calling its resolve function, then calls completeValue to complete promises, * serialize scalars, or execute the sub-selection-set for objects. */ -function executeField(exeContext, parentType, source, fieldGroup, path, incrementalContext, deferMap) { + +function executeField(exeContext, parentType, source, fieldNodes, path) { var _fieldDef$resolve; - const fieldName = fieldGroup[0].node.name.value; - const fieldDef = exeContext.schema.getField(parentType, fieldName); + const fieldDef = getFieldDef(exeContext.schema, parentType, fieldNodes[0]); if (!fieldDef) { return; } const returnType = fieldDef.type; const resolveFn = (_fieldDef$resolve = fieldDef.resolve) !== null && _fieldDef$resolve !== void 0 ? _fieldDef$resolve : exeContext.fieldResolver; - const info = buildResolveInfo(exeContext, fieldDef, toNodes(fieldGroup), parentType, path); - // Get the resolve function, regardless of if its result is normal or abrupt (error). + const info = buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path); // Get the resolve function, regardless of if its result is normal or abrupt (error). + try { // Build a JS object of arguments from the field.arguments AST, using the // variables scope to fulfill any variable references. // TODO: find a way to memoize, in case this field is within a List type. - const args = (0, _values.getArgumentValues)(fieldDef, fieldGroup[0].node, exeContext.variableValues); - // The resolve function's optional third argument is a context value that + const args = (0, _values.getArgumentValues)(fieldDef, fieldNodes[0], exeContext.variableValues); // The resolve function's optional third argument is a context value that // is provided to every resolve function within an execution. It is commonly // used to represent an authenticated user, or request-specific caches. + const contextValue = exeContext.contextValue; const result = resolveFn(source, args, contextValue, info); + let completed; if ((0, _isPromise.isPromise)(result)) { - return completePromisedValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); + completed = result.then(resolved => completeValue(exeContext, returnType, fieldNodes, info, path, resolved)); + } else { + completed = completeValue(exeContext, returnType, fieldNodes, info, path, result); } - const completed = completeValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); if ((0, _isPromise.isPromise)(completed)) { // Note: we don't rely on a `catch` method, but we do expect "thenable" // to take a second callback for the error case. return completed.then(undefined, rawError => { - handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); - return [null, undefined]; + const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(path)); + return handleFieldError(error, returnType, exeContext); }); } return completed; } catch (rawError) { - handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); - return [null, undefined]; + const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(path)); + return handleFieldError(error, returnType, exeContext); } } /** - * TODO: consider no longer exporting this function * @internal */ + function buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path) { // The resolve function's optional fourth argument is a collection of // information about the current execution state. @@ -24466,22 +23835,16 @@ function buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path) { variableValues: exeContext.variableValues }; } -function handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext) { - const error = (0, _locatedError.locatedError)(rawError, toNodes(fieldGroup), (0, _Path.pathToArray)(path)); +function handleFieldError(error, returnType, exeContext) { // If the field type is non-nullable, then it is resolved without any // protection from errors, however it still properly locates the error. if ((0, _definition.isNonNullType)(returnType)) { throw error; - } - // Otherwise, error protection is applied, logging the error and resolving + } // Otherwise, error protection is applied, logging the error and resolving // a null value for this field if one is encountered. - const context = incrementalContext !== null && incrementalContext !== void 0 ? incrementalContext : exeContext; - let errors = context.errors; - if (errors === undefined) { - errors = []; - context.errors = errors; - } - errors.push(error); + + exeContext.errors.push(error); + return null; } /** * Implements the instructions for completeValue as defined in the @@ -24504,271 +23867,94 @@ function handleFieldError(rawError, exeContext, returnType, fieldGroup, path, in * Otherwise, the field type expects a sub-selection set, and will complete the * value by executing all sub-selections. */ -function completeValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { + +function completeValue(exeContext, returnType, fieldNodes, info, path, result) { // If result is an Error, throw a located error. if (result instanceof Error) { throw result; - } - // If field type is NonNull, complete for inner type, and throw field error + } // If field type is NonNull, complete for inner type, and throw field error // if result is null. + if ((0, _definition.isNonNullType)(returnType)) { - const completed = completeValue(exeContext, returnType.ofType, fieldGroup, info, path, result, incrementalContext, deferMap); - if (completed[0] === null) { + const completed = completeValue(exeContext, returnType.ofType, fieldNodes, info, path, result); + if (completed === null) { throw new Error(`Cannot return null for non-nullable field ${info.parentType.name}.${info.fieldName}.`); } return completed; - } - // If result value is null or undefined then return null. + } // If result value is null or undefined then return null. + if (result == null) { - return [null, undefined]; - } - // If field type is List, complete each item in the list with the inner type + return null; + } // If field type is List, complete each item in the list with the inner type + if ((0, _definition.isListType)(returnType)) { - return completeListValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); - } - // If field type is a leaf type, Scalar or Enum, serialize to a valid value, + return completeListValue(exeContext, returnType, fieldNodes, info, path, result); + } // If field type is a leaf type, Scalar or Enum, serialize to a valid value, // returning null if serialization is not possible. + if ((0, _definition.isLeafType)(returnType)) { - return [completeLeafValue(returnType, result), undefined]; - } - // If field type is an abstract type, Interface or Union, determine the + return completeLeafValue(returnType, result); + } // If field type is an abstract type, Interface or Union, determine the // runtime Object type and complete for that type. + if ((0, _definition.isAbstractType)(returnType)) { - return completeAbstractValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); - } - // If field type is Object, execute and complete all sub-selections. + return completeAbstractValue(exeContext, returnType, fieldNodes, info, path, result); + } // If field type is Object, execute and complete all sub-selections. + if ((0, _definition.isObjectType)(returnType)) { - return completeObjectValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); + return completeObjectValue(exeContext, returnType, fieldNodes, info, path, result); } /* c8 ignore next 6 */ // Not reachable, all possible output types have been considered. + false || (0, _invariant.invariant)(false, 'Cannot complete value of unexpected output type: ' + (0, _inspect.inspect)(returnType)); } -async function completePromisedValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { - try { - const resolved = await result; - let completed = completeValue(exeContext, returnType, fieldGroup, info, path, resolved, incrementalContext, deferMap); - if ((0, _isPromise.isPromise)(completed)) { - completed = await completed; - } - return completed; - } catch (rawError) { - handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); - return [null, undefined]; - } -} -/** - * Returns an object containing info for streaming if a field should be - * streamed based on the experimental flag, stream directive present and - * not disabled by the "if" argument. - */ -function getStreamUsage(exeContext, fieldGroup, path) { - // do not stream inner lists of multi-dimensional lists - if (typeof path.key === 'number') { - return; - } - // TODO: add test for this case (a streamed list nested under a list). - /* c8 ignore next 7 */ - if (fieldGroup._streamUsage !== undefined) { - return fieldGroup._streamUsage; - } - // validation only allows equivalent streams on multiple fields, so it is - // safe to only check the first fieldNode for the stream directive - const stream = (0, _values.getDirectiveValues)(_directives.GraphQLStreamDirective, fieldGroup[0].node, exeContext.variableValues); - if (!stream) { - return; - } - if (stream.if === false) { - return; - } - typeof stream.initialCount === 'number' || (0, _invariant.invariant)(false, 'initialCount must be a number'); - stream.initialCount >= 0 || (0, _invariant.invariant)(false, 'initialCount must be a positive integer'); - exeContext.operation.operation !== _ast.OperationTypeNode.SUBSCRIPTION || (0, _invariant.invariant)(false, '`@stream` directive not supported on subscription operations. Disable `@stream` by setting the `if` argument to `false`.'); - const streamedFieldGroup = fieldGroup.map(fieldDetails => ({ - node: fieldDetails.node, - deferUsage: undefined - })); - const streamUsage = { - initialCount: stream.initialCount, - label: typeof stream.label === 'string' ? stream.label : undefined, - fieldGroup: streamedFieldGroup - }; - fieldGroup._streamUsage = streamUsage; - return streamUsage; -} -/** - * Complete a async iterator value by completing the result and calling - * recursively until all the results are completed. - */ -async function completeAsyncIteratorValue(exeContext, itemType, fieldGroup, info, path, asyncIterator, incrementalContext, deferMap) { - let containsPromise = false; - const completedResults = []; - const graphqlWrappedResult = [completedResults, undefined]; - let index = 0; - const streamUsage = getStreamUsage(exeContext, fieldGroup, path); - const earlyReturn = asyncIterator.return === undefined ? undefined : asyncIterator.return.bind(asyncIterator); - try { - // eslint-disable-next-line no-constant-condition - while (true) { - if (streamUsage && index >= streamUsage.initialCount) { - const streamItemQueue = buildAsyncStreamItemQueue(index, path, asyncIterator, exeContext, streamUsage.fieldGroup, info, itemType); - let streamRecord; - if (earlyReturn === undefined) { - streamRecord = { - label: streamUsage.label, - path, - streamItemQueue - }; - } else { - streamRecord = { - label: streamUsage.label, - path, - earlyReturn, - streamItemQueue - }; - if (exeContext.cancellableStreams === undefined) { - exeContext.cancellableStreams = new Set(); - } - exeContext.cancellableStreams.add(streamRecord); - } - addIncrementalDataRecords(graphqlWrappedResult, [streamRecord]); - break; - } - const itemPath = (0, _Path.addPath)(path, index, undefined); - let iteration; - try { - // eslint-disable-next-line no-await-in-loop - iteration = await asyncIterator.next(); - } catch (rawError) { - throw (0, _locatedError.locatedError)(rawError, toNodes(fieldGroup), (0, _Path.pathToArray)(path)); - } - // TODO: add test case for stream returning done before initialCount - /* c8 ignore next 3 */ - if (iteration.done) { - break; - } - const item = iteration.value; - // TODO: add tests for stream backed by asyncIterator that returns a promise - /* c8 ignore start */ - if ((0, _isPromise.isPromise)(item)) { - completedResults.push(completePromisedListItemValue(item, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap)); - containsPromise = true; - } else if ( /* c8 ignore stop */ - completeListItemValue(item, completedResults, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap) - // TODO: add tests for stream backed by asyncIterator that completes to a promise - /* c8 ignore start */) { - containsPromise = true; - } - /* c8 ignore stop */ - index++; - } - } catch (error) { - if (earlyReturn !== undefined) { - earlyReturn().catch(() => { - /* c8 ignore next 1 */ - // ignore error - }); - } - throw error; - } - return containsPromise ? /* c8 ignore start */Promise.all(completedResults).then(resolved => [resolved, graphqlWrappedResult[1]]) : /* c8 ignore stop */graphqlWrappedResult; -} /** * Complete a list value by completing each item in the list with the * inner type */ -function completeListValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { - const itemType = returnType.ofType; - if ((0, _isAsyncIterable.isAsyncIterable)(result)) { - const asyncIterator = result[Symbol.asyncIterator](); - return completeAsyncIteratorValue(exeContext, itemType, fieldGroup, info, path, asyncIterator, incrementalContext, deferMap); - } + +function completeListValue(exeContext, returnType, fieldNodes, info, path, result) { if (!(0, _isIterableObject.isIterableObject)(result)) { throw new _GraphQLError.GraphQLError(`Expected Iterable, but did not find one for field "${info.parentType.name}.${info.fieldName}".`); - } - return completeIterableValue(exeContext, itemType, fieldGroup, info, path, result, incrementalContext, deferMap); -} -function completeIterableValue(exeContext, itemType, fieldGroup, info, path, items, incrementalContext, deferMap) { - // This is specified as a simple map, however we're optimizing the path + } // This is specified as a simple map, however we're optimizing the path // where the list contains no Promises by avoiding creating another Promise. + + const itemType = returnType.ofType; let containsPromise = false; - const completedResults = []; - const graphqlWrappedResult = [completedResults, undefined]; - let index = 0; - const streamUsage = getStreamUsage(exeContext, fieldGroup, path); - const iterator = items[Symbol.iterator](); - let iteration = iterator.next(); - while (!iteration.done) { - const item = iteration.value; - if (streamUsage && index >= streamUsage.initialCount) { - const syncStreamRecord = { - label: streamUsage.label, - path, - streamItemQueue: buildSyncStreamItemQueue(item, index, path, iterator, exeContext, streamUsage.fieldGroup, info, itemType) - }; - addIncrementalDataRecords(graphqlWrappedResult, [syncStreamRecord]); - break; - } + const completedResults = Array.from(result, (item, index) => { // No need to modify the info object containing the path, // since from here on it is not ever accessed by resolver functions. const itemPath = (0, _Path.addPath)(path, index, undefined); - if ((0, _isPromise.isPromise)(item)) { - completedResults.push(completePromisedListItemValue(item, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap)); - containsPromise = true; - } else if (completeListItemValue(item, completedResults, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap)) { - containsPromise = true; + try { + let completedItem; + if ((0, _isPromise.isPromise)(item)) { + completedItem = item.then(resolved => completeValue(exeContext, itemType, fieldNodes, info, itemPath, resolved)); + } else { + completedItem = completeValue(exeContext, itemType, fieldNodes, info, itemPath, item); + } + if ((0, _isPromise.isPromise)(completedItem)) { + containsPromise = true; // Note: we don't rely on a `catch` method, but we do expect "thenable" + // to take a second callback for the error case. + + return completedItem.then(undefined, rawError => { + const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(itemPath)); + return handleFieldError(error, itemType, exeContext); + }); + } + return completedItem; + } catch (rawError) { + const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(itemPath)); + return handleFieldError(error, itemType, exeContext); } - index++; - iteration = iterator.next(); - } - return containsPromise ? Promise.all(completedResults).then(resolved => [resolved, graphqlWrappedResult[1]]) : graphqlWrappedResult; -} -/** - * Complete a list item value by adding it to the completed results. - * - * Returns true if the value is a Promise. - */ -function completeListItemValue(item, completedResults, parent, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap) { - try { - const completedItem = completeValue(exeContext, itemType, fieldGroup, info, itemPath, item, incrementalContext, deferMap); - if ((0, _isPromise.isPromise)(completedItem)) { - // Note: we don't rely on a `catch` method, but we do expect "thenable" - // to take a second callback for the error case. - completedResults.push(completedItem.then(resolved => { - addIncrementalDataRecords(parent, resolved[1]); - return resolved[0]; - }, rawError => { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - return null; - })); - return true; - } - completedResults.push(completedItem[0]); - addIncrementalDataRecords(parent, completedItem[1]); - } catch (rawError) { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - completedResults.push(null); - } - return false; -} -async function completePromisedListItemValue(item, parent, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap) { - try { - const resolved = await item; - let completed = completeValue(exeContext, itemType, fieldGroup, info, itemPath, resolved, incrementalContext, deferMap); - if ((0, _isPromise.isPromise)(completed)) { - completed = await completed; - } - addIncrementalDataRecords(parent, completed[1]); - return completed[0]; - } catch (rawError) { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - return null; - } + }); + return containsPromise ? Promise.all(completedResults) : completedResults; } /** * Complete a Scalar or Enum by serializing to a valid value, returning * null if serialization is not possible. */ + function completeLeafValue(returnType, result) { const serializedResult = returnType.serialize(result); if (serializedResult == null) { @@ -24780,24 +23966,23 @@ function completeLeafValue(returnType, result) { * Complete a value of an abstract type by determining the runtime object type * of that value, then complete the value for that type. */ -function completeAbstractValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { + +function completeAbstractValue(exeContext, returnType, fieldNodes, info, path, result) { var _returnType$resolveTy; const resolveTypeFn = (_returnType$resolveTy = returnType.resolveType) !== null && _returnType$resolveTy !== void 0 ? _returnType$resolveTy : exeContext.typeResolver; const contextValue = exeContext.contextValue; const runtimeType = resolveTypeFn(result, contextValue, info, returnType); if ((0, _isPromise.isPromise)(runtimeType)) { - return runtimeType.then(resolvedRuntimeType => completeObjectValue(exeContext, ensureValidRuntimeType(resolvedRuntimeType, exeContext, returnType, fieldGroup, info, result), fieldGroup, info, path, result, incrementalContext, deferMap)); + return runtimeType.then(resolvedRuntimeType => completeObjectValue(exeContext, ensureValidRuntimeType(resolvedRuntimeType, exeContext, returnType, fieldNodes, info, result), fieldNodes, info, path, result)); } - return completeObjectValue(exeContext, ensureValidRuntimeType(runtimeType, exeContext, returnType, fieldGroup, info, result), fieldGroup, info, path, result, incrementalContext, deferMap); + return completeObjectValue(exeContext, ensureValidRuntimeType(runtimeType, exeContext, returnType, fieldNodes, info, result), fieldNodes, info, path, result); } -function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldGroup, info, result) { +function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldNodes, info, result) { if (runtimeTypeName == null) { - throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" must resolve to an Object type at runtime for field "${info.parentType.name}.${info.fieldName}". Either the "${returnType.name}" type should provide a "resolveType" function or each possible type should provide an "isTypeOf" function.`, { - nodes: toNodes(fieldGroup) - }); - } - // releases before 16.0.0 supported returning `GraphQLObjectType` from `resolveType` + throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" must resolve to an Object type at runtime for field "${info.parentType.name}.${info.fieldName}". Either the "${returnType.name}" type should provide a "resolveType" function or each possible type should provide an "isTypeOf" function.`, fieldNodes); + } // releases before 16.0.0 supported returning `GraphQLObjectType` from `resolveType` // TODO: remove in 17.0.0 release + if ((0, _definition.isObjectType)(runtimeTypeName)) { throw new _GraphQLError.GraphQLError('Support for returning GraphQLObjectType from resolveType was removed in graphql-js@16.0.0 please return type name instead.'); } @@ -24807,17 +23992,17 @@ function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldGr const runtimeType = exeContext.schema.getType(runtimeTypeName); if (runtimeType == null) { throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" was resolved to a type "${runtimeTypeName}" that does not exist inside the schema.`, { - nodes: toNodes(fieldGroup) + nodes: fieldNodes }); } if (!(0, _definition.isObjectType)(runtimeType)) { throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" was resolved to a non-object type "${runtimeTypeName}".`, { - nodes: toNodes(fieldGroup) + nodes: fieldNodes }); } if (!exeContext.schema.isSubType(returnType, runtimeType)) { throw new _GraphQLError.GraphQLError(`Runtime Object type "${runtimeType.name}" is not a possible type for "${returnType.name}".`, { - nodes: toNodes(fieldGroup) + nodes: fieldNodes }); } return runtimeType; @@ -24825,92 +24010,34 @@ function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldGr /** * Complete an Object value by executing all sub-selections. */ -function completeObjectValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { - // If there is an isTypeOf predicate function, call it with the + +function completeObjectValue(exeContext, returnType, fieldNodes, info, path, result) { + // Collect sub-fields to execute to complete this value. + const subFieldNodes = collectSubfields(exeContext, returnType, fieldNodes); // If there is an isTypeOf predicate function, call it with the // current result. If isTypeOf returns false, then raise an error rather // than continuing execution. + if (returnType.isTypeOf) { const isTypeOf = returnType.isTypeOf(result, exeContext.contextValue, info); if ((0, _isPromise.isPromise)(isTypeOf)) { return isTypeOf.then(resolvedIsTypeOf => { if (!resolvedIsTypeOf) { - throw invalidReturnTypeError(returnType, result, fieldGroup); + throw invalidReturnTypeError(returnType, result, fieldNodes); } - return collectAndExecuteSubfields(exeContext, returnType, fieldGroup, path, result, incrementalContext, deferMap); + return executeFields(exeContext, returnType, result, path, subFieldNodes); }); } if (!isTypeOf) { - throw invalidReturnTypeError(returnType, result, fieldGroup); + throw invalidReturnTypeError(returnType, result, fieldNodes); } } - return collectAndExecuteSubfields(exeContext, returnType, fieldGroup, path, result, incrementalContext, deferMap); + return executeFields(exeContext, returnType, result, path, subFieldNodes); } -function invalidReturnTypeError(returnType, result, fieldGroup) { +function invalidReturnTypeError(returnType, result, fieldNodes) { return new _GraphQLError.GraphQLError(`Expected value of type "${returnType.name}" but got: ${(0, _inspect.inspect)(result)}.`, { - nodes: toNodes(fieldGroup) + nodes: fieldNodes }); } -/** - * Instantiates new DeferredFragmentRecords for the given path within an - * incremental data record, returning an updated map of DeferUsage - * objects to DeferredFragmentRecords. - * - * Note: As defer directives may be used with operations returning lists, - * a DeferUsage object may correspond to many DeferredFragmentRecords. - * - * DeferredFragmentRecord creation includes the following steps: - * 1. The new DeferredFragmentRecord is instantiated at the given path. - * 2. The parent result record is calculated from the given incremental data - * record. - * 3. The IncrementalPublisher is notified that a new DeferredFragmentRecord - * with the calculated parent has been added; the record will be released only - * after the parent has completed. - * - */ -function addNewDeferredFragments(newDeferUsages, newDeferMap, path) { - // For each new deferUsage object: - for (const newDeferUsage of newDeferUsages) { - const parentDeferUsage = newDeferUsage.parentDeferUsage; - const parent = parentDeferUsage === undefined ? undefined : deferredFragmentRecordFromDeferUsage(parentDeferUsage, newDeferMap); - // Instantiate the new record. - const deferredFragmentRecord = new _types.DeferredFragmentRecord(path, newDeferUsage.label, parent); - // Update the map. - newDeferMap.set(newDeferUsage, deferredFragmentRecord); - } - return newDeferMap; -} -function deferredFragmentRecordFromDeferUsage(deferUsage, deferMap) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return deferMap.get(deferUsage); -} -function collectAndExecuteSubfields(exeContext, returnType, fieldGroup, path, result, incrementalContext, deferMap) { - // Collect sub-fields to execute to complete this value. - const collectedSubfields = collectSubfields(exeContext, returnType, fieldGroup); - let groupedFieldSet = collectedSubfields.groupedFieldSet; - const newDeferUsages = collectedSubfields.newDeferUsages; - if (deferMap === undefined && newDeferUsages.length === 0) { - return executeFields(exeContext, returnType, result, path, groupedFieldSet, incrementalContext, undefined); - } - const subExecutionPlan = buildSubExecutionPlan(groupedFieldSet, incrementalContext === null || incrementalContext === void 0 ? void 0 : incrementalContext.deferUsageSet); - groupedFieldSet = subExecutionPlan.groupedFieldSet; - const newGroupedFieldSets = subExecutionPlan.newGroupedFieldSets; - const newDeferMap = addNewDeferredFragments(newDeferUsages, new Map(deferMap), path); - const subFields = executeFields(exeContext, returnType, result, path, groupedFieldSet, incrementalContext, newDeferMap); - if (newGroupedFieldSets.size > 0) { - const newPendingExecutionGroups = collectExecutionGroups(exeContext, returnType, result, path, incrementalContext === null || incrementalContext === void 0 ? void 0 : incrementalContext.deferUsageSet, newGroupedFieldSets, newDeferMap); - return withNewExecutionGroups(subFields, newPendingExecutionGroups); - } - return subFields; -} -function buildSubExecutionPlan(originalGroupedFieldSet, deferUsageSet) { - let executionPlan = originalGroupedFieldSet._executionPlan; - if (executionPlan !== undefined) { - return executionPlan; - } - executionPlan = (0, _buildExecutionPlan.buildExecutionPlan)(originalGroupedFieldSet, deferUsageSet); - originalGroupedFieldSet._executionPlan = executionPlan; - return executionPlan; -} /** * If a resolveType function is not given, then a default resolve behavior is * used which attempts two strategies: @@ -24921,12 +24048,13 @@ function buildSubExecutionPlan(originalGroupedFieldSet, deferUsageSet) { * Otherwise, test each possible type for the abstract type by calling * isTypeOf for the object being coerced, returning the first type that matches. */ + const defaultTypeResolver = function (value, contextValue, info, abstractType) { // First, look for `__typename`. if ((0, _isObjectLike.isObjectLike)(value) && typeof value.__typename === 'string') { return value.__typename; - } - // Otherwise, test each possible type. + } // Otherwise, test each possible type. + const possibleTypes = info.schema.getPossibleTypes(abstractType); const promisedIsTypeOfResults = []; for (let i = 0; i < possibleTypes.length; i++) { @@ -24968,340 +24096,27 @@ const defaultFieldResolver = function (source, args, contextValue, info) { } }; /** - * Implements the "Subscribe" algorithm described in the GraphQL specification. + * This method looks up the field on the given type definition. + * It has special casing for the three introspection fields, + * __schema, __type and __typename. __typename is special because + * it can always be queried as a field, even in situations where no + * other fields are allowed, like on a Union. __schema and __type + * could get automatically added to the query type, but that would + * require mutating type definitions, which would cause issues. * - * Returns a Promise which resolves to either an AsyncIterator (if successful) - * or an ExecutionResult (error). The promise will be rejected if the schema or - * other arguments to this function are invalid, or if the resolved event stream - * is not an async iterable. - * - * If the client-provided arguments to this function do not result in a - * compliant subscription, a GraphQL Response (ExecutionResult) with descriptive - * errors and no data will be returned. - * - * If the source stream could not be created due to faulty subscription resolver - * logic or underlying systems, the promise will resolve to a single - * ExecutionResult containing `errors` and no `data`. - * - * If the operation succeeded, the promise resolves to an AsyncIterator, which - * yields a stream of ExecutionResults representing the response stream. - * - * This function does not support incremental delivery (`@defer` and `@stream`). - * If an operation which would defer or stream data is executed with this - * function, a field error will be raised at the location of the `@defer` or - * `@stream` directive. - * - * Accepts an object with named arguments. + * @internal */ exports.defaultFieldResolver = defaultFieldResolver; -function subscribe(args) { - // If a valid execution context cannot be created due to incorrect arguments, - // a "Response" with only errors is returned. - const exeContext = buildExecutionContext(args); - // Return early errors if execution context failed. - if (!('schema' in exeContext)) { - return { - errors: exeContext - }; +function getFieldDef(schema, parentType, fieldNode) { + const fieldName = fieldNode.name.value; + if (fieldName === _introspection.SchemaMetaFieldDef.name && schema.getQueryType() === parentType) { + return _introspection.SchemaMetaFieldDef; + } else if (fieldName === _introspection.TypeMetaFieldDef.name && schema.getQueryType() === parentType) { + return _introspection.TypeMetaFieldDef; + } else if (fieldName === _introspection.TypeNameMetaFieldDef.name) { + return _introspection.TypeNameMetaFieldDef; } - const resultOrStream = createSourceEventStreamImpl(exeContext); - if ((0, _isPromise.isPromise)(resultOrStream)) { - return resultOrStream.then(resolvedResultOrStream => mapSourceToResponse(exeContext, resolvedResultOrStream)); - } - return mapSourceToResponse(exeContext, resultOrStream); -} -function mapSourceToResponse(exeContext, resultOrStream) { - if (!(0, _isAsyncIterable.isAsyncIterable)(resultOrStream)) { - return resultOrStream; - } - // For each payload yielded from a subscription, map it over the normal - // GraphQL `execute` function, with `payload` as the rootValue. - // This implements the "MapSourceToResponseEvent" algorithm described in - // the GraphQL specification. The `execute` function provides the - // "ExecuteSubscriptionEvent" algorithm, as it is nearly identical to the - // "ExecuteQuery" algorithm, for which `execute` is also used. - return (0, _mapAsyncIterable.mapAsyncIterable)(resultOrStream, payload => executeOperation(buildPerEventExecutionContext(exeContext, payload))); -} -/** - * Implements the "CreateSourceEventStream" algorithm described in the - * GraphQL specification, resolving the subscription source event stream. - * - * Returns a Promise which resolves to either an AsyncIterable (if successful) - * or an ExecutionResult (error). The promise will be rejected if the schema or - * other arguments to this function are invalid, or if the resolved event stream - * is not an async iterable. - * - * If the client-provided arguments to this function do not result in a - * compliant subscription, a GraphQL Response (ExecutionResult) with - * descriptive errors and no data will be returned. - * - * If the the source stream could not be created due to faulty subscription - * resolver logic or underlying systems, the promise will resolve to a single - * ExecutionResult containing `errors` and no `data`. - * - * If the operation succeeded, the promise resolves to the AsyncIterable for the - * event stream returned by the resolver. - * - * A Source Event Stream represents a sequence of events, each of which triggers - * a GraphQL execution for that event. - * - * This may be useful when hosting the stateful subscription service in a - * different process or machine than the stateless GraphQL execution engine, - * or otherwise separating these two steps. For more on this, see the - * "Supporting Subscriptions at Scale" information in the GraphQL specification. - */ -function createSourceEventStream(args) { - // If a valid execution context cannot be created due to incorrect arguments, - // a "Response" with only errors is returned. - const exeContext = buildExecutionContext(args); - // Return early errors if execution context failed. - if (!('schema' in exeContext)) { - return { - errors: exeContext - }; - } - return createSourceEventStreamImpl(exeContext); -} -function createSourceEventStreamImpl(exeContext) { - try { - const eventStream = executeSubscription(exeContext); - if ((0, _isPromise.isPromise)(eventStream)) { - return eventStream.then(undefined, error => ({ - errors: [error] - })); - } - return eventStream; - } catch (error) { - return { - errors: [error] - }; - } -} -function executeSubscription(exeContext) { - const { - schema, - fragments, - operation, - variableValues, - rootValue - } = exeContext; - const rootType = schema.getSubscriptionType(); - if (rootType == null) { - throw new _GraphQLError.GraphQLError('Schema is not configured to execute subscription operation.', { - nodes: operation - }); - } - const { - groupedFieldSet - } = (0, _collectFields.collectFields)(schema, fragments, variableValues, rootType, operation); - const firstRootField = groupedFieldSet.entries().next().value; - const [responseName, fieldGroup] = firstRootField; - const fieldName = fieldGroup[0].node.name.value; - const fieldDef = schema.getField(rootType, fieldName); - const fieldNodes = fieldGroup.map(fieldDetails => fieldDetails.node); - if (!fieldDef) { - throw new _GraphQLError.GraphQLError(`The subscription field "${fieldName}" is not defined.`, { - nodes: fieldNodes - }); - } - const path = (0, _Path.addPath)(undefined, responseName, rootType.name); - const info = buildResolveInfo(exeContext, fieldDef, fieldNodes, rootType, path); - try { - var _fieldDef$subscribe; - // Implements the "ResolveFieldEventStream" algorithm from GraphQL specification. - // It differs from "ResolveFieldValue" due to providing a different `resolveFn`. - // Build a JS object of arguments from the field.arguments AST, using the - // variables scope to fulfill any variable references. - const args = (0, _values.getArgumentValues)(fieldDef, fieldNodes[0], variableValues); - // The resolve function's optional third argument is a context value that - // is provided to every resolve function within an execution. It is commonly - // used to represent an authenticated user, or request-specific caches. - const contextValue = exeContext.contextValue; - // Call the `subscribe()` resolver or the default resolver to produce an - // AsyncIterable yielding raw payloads. - const resolveFn = (_fieldDef$subscribe = fieldDef.subscribe) !== null && _fieldDef$subscribe !== void 0 ? _fieldDef$subscribe : exeContext.subscribeFieldResolver; - const result = resolveFn(rootValue, args, contextValue, info); - if ((0, _isPromise.isPromise)(result)) { - return result.then(assertEventStream).then(undefined, error => { - throw (0, _locatedError.locatedError)(error, fieldNodes, (0, _Path.pathToArray)(path)); - }); - } - return assertEventStream(result); - } catch (error) { - throw (0, _locatedError.locatedError)(error, fieldNodes, (0, _Path.pathToArray)(path)); - } -} -function assertEventStream(result) { - if (result instanceof Error) { - throw result; - } - // Assert field returned an event stream, otherwise yield an error. - if (!(0, _isAsyncIterable.isAsyncIterable)(result)) { - throw new _GraphQLError.GraphQLError('Subscription field must return Async Iterable. ' + `Received: ${(0, _inspect.inspect)(result)}.`); - } - return result; -} -function collectExecutionGroups(exeContext, parentType, sourceValue, path, parentDeferUsages, newGroupedFieldSets, deferMap) { - const newPendingExecutionGroups = []; - for (const [deferUsageSet, groupedFieldSet] of newGroupedFieldSets) { - const deferredFragmentRecords = getDeferredFragmentRecords(deferUsageSet, deferMap); - const pendingExecutionGroup = { - deferredFragmentRecords, - result: undefined - }; - const executor = () => executeExecutionGroup(pendingExecutionGroup, exeContext, parentType, sourceValue, path, groupedFieldSet, { - errors: undefined, - deferUsageSet - }, deferMap); - if (exeContext.enableEarlyExecution) { - pendingExecutionGroup.result = new _BoxedPromiseOrValue.BoxedPromiseOrValue(shouldDefer(parentDeferUsages, deferUsageSet) ? Promise.resolve().then(executor) : executor()); - } else { - pendingExecutionGroup.result = () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor()); - } - newPendingExecutionGroups.push(pendingExecutionGroup); - } - return newPendingExecutionGroups; -} -function shouldDefer(parentDeferUsages, deferUsages) { - // If we have a new child defer usage, defer. - // Otherwise, this defer usage was already deferred when it was initially - // encountered, and is now in the midst of executing early, so the new - // deferred grouped fields set can be executed immediately. - return parentDeferUsages === undefined || !Array.from(deferUsages).every(deferUsage => parentDeferUsages.has(deferUsage)); -} -function executeExecutionGroup(pendingExecutionGroup, exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap) { - let result; - try { - result = executeFields(exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap); - } catch (error) { - return { - pendingExecutionGroup, - path: (0, _Path.pathToArray)(path), - errors: withError(incrementalContext.errors, error) - }; - } - if ((0, _isPromise.isPromise)(result)) { - return result.then(resolved => buildCompletedExecutionGroup(incrementalContext.errors, pendingExecutionGroup, path, resolved), error => ({ - pendingExecutionGroup, - path: (0, _Path.pathToArray)(path), - errors: withError(incrementalContext.errors, error) - })); - } - return buildCompletedExecutionGroup(incrementalContext.errors, pendingExecutionGroup, path, result); -} -function buildCompletedExecutionGroup(errors, pendingExecutionGroup, path, result) { - return { - pendingExecutionGroup, - path: (0, _Path.pathToArray)(path), - result: errors === undefined ? { - data: result[0] - } : { - data: result[0], - errors - }, - incrementalDataRecords: result[1] - }; -} -function getDeferredFragmentRecords(deferUsages, deferMap) { - return Array.from(deferUsages).map(deferUsage => deferredFragmentRecordFromDeferUsage(deferUsage, deferMap)); -} -function buildSyncStreamItemQueue(initialItem, initialIndex, streamPath, iterator, exeContext, fieldGroup, info, itemType) { - const streamItemQueue = []; - const enableEarlyExecution = exeContext.enableEarlyExecution; - const firstExecutor = () => { - const initialPath = (0, _Path.addPath)(streamPath, initialIndex, undefined); - const firstStreamItem = new _BoxedPromiseOrValue.BoxedPromiseOrValue(completeStreamItem(initialPath, initialItem, exeContext, { - errors: undefined - }, fieldGroup, info, itemType)); - let iteration = iterator.next(); - let currentIndex = initialIndex + 1; - let currentStreamItem = firstStreamItem; - while (!iteration.done) { - // TODO: add test case for early sync termination - /* c8 ignore next 6 */ - if (currentStreamItem instanceof _BoxedPromiseOrValue.BoxedPromiseOrValue) { - const result = currentStreamItem.value; - if (!(0, _isPromise.isPromise)(result) && result.errors !== undefined) { - break; - } - } - const itemPath = (0, _Path.addPath)(streamPath, currentIndex, undefined); - const value = iteration.value; - const currentExecutor = () => completeStreamItem(itemPath, value, exeContext, { - errors: undefined - }, fieldGroup, info, itemType); - currentStreamItem = enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(currentExecutor()) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(currentExecutor()); - streamItemQueue.push(currentStreamItem); - iteration = iterator.next(); - currentIndex = initialIndex + 1; - } - streamItemQueue.push(new _BoxedPromiseOrValue.BoxedPromiseOrValue({})); - return firstStreamItem.value; - }; - streamItemQueue.push(enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(Promise.resolve().then(firstExecutor)) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(firstExecutor())); - return streamItemQueue; -} -function buildAsyncStreamItemQueue(initialIndex, streamPath, asyncIterator, exeContext, fieldGroup, info, itemType) { - const streamItemQueue = []; - const executor = () => getNextAsyncStreamItemResult(streamItemQueue, streamPath, initialIndex, asyncIterator, exeContext, fieldGroup, info, itemType); - streamItemQueue.push(exeContext.enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor()) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor())); - return streamItemQueue; -} -async function getNextAsyncStreamItemResult(streamItemQueue, streamPath, index, asyncIterator, exeContext, fieldGroup, info, itemType) { - let iteration; - try { - iteration = await asyncIterator.next(); - } catch (error) { - return { - errors: [(0, _locatedError.locatedError)(error, toNodes(fieldGroup), (0, _Path.pathToArray)(streamPath))] - }; - } - if (iteration.done) { - return {}; - } - const itemPath = (0, _Path.addPath)(streamPath, index, undefined); - const result = completeStreamItem(itemPath, iteration.value, exeContext, { - errors: undefined - }, fieldGroup, info, itemType); - const executor = () => getNextAsyncStreamItemResult(streamItemQueue, streamPath, index + 1, asyncIterator, exeContext, fieldGroup, info, itemType); - streamItemQueue.push(exeContext.enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor()) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor())); - return result; -} -function completeStreamItem(itemPath, item, exeContext, incrementalContext, fieldGroup, info, itemType) { - if ((0, _isPromise.isPromise)(item)) { - return completePromisedValue(exeContext, itemType, fieldGroup, info, itemPath, item, incrementalContext, new Map()).then(resolvedItem => buildStreamItemResult(incrementalContext.errors, resolvedItem), error => ({ - errors: withError(incrementalContext.errors, error) - })); - } - let result; - try { - try { - result = completeValue(exeContext, itemType, fieldGroup, info, itemPath, item, incrementalContext, new Map()); - } catch (rawError) { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - result = [null, undefined]; - } - } catch (error) { - return { - errors: withError(incrementalContext.errors, error) - }; - } - if ((0, _isPromise.isPromise)(result)) { - return result.then(undefined, rawError => { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - return [null, undefined]; - }).then(resolvedItem => buildStreamItemResult(incrementalContext.errors, resolvedItem), error => ({ - errors: withError(incrementalContext.errors, error) - })); - } - return buildStreamItemResult(incrementalContext.errors, result); -} -function buildStreamItemResult(errors, result) { - return { - item: result[0], - errors, - incrementalDataRecords: result[1] - }; + return parentType.getFields()[fieldName]; } /***/ }), @@ -25320,7 +24135,7 @@ Object.defineProperty(exports, "__esModule", ({ Object.defineProperty(exports, "createSourceEventStream", ({ enumerable: true, get: function () { - return _execute.createSourceEventStream; + return _subscribe.createSourceEventStream; } })); Object.defineProperty(exports, "defaultFieldResolver", ({ @@ -25347,12 +24162,6 @@ Object.defineProperty(exports, "executeSync", ({ return _execute.executeSync; } })); -Object.defineProperty(exports, "experimentalExecuteIncrementally", ({ - enumerable: true, - get: function () { - return _execute.experimentalExecuteIncrementally; - } -})); Object.defineProperty(exports, "getArgumentValues", ({ enumerable: true, get: function () { @@ -25380,18 +24189,19 @@ Object.defineProperty(exports, "responsePathAsArray", ({ Object.defineProperty(exports, "subscribe", ({ enumerable: true, get: function () { - return _execute.subscribe; + return _subscribe.subscribe; } })); var _Path = __webpack_require__(/*! ../jsutils/Path.mjs */ "../../../node_modules/graphql/jsutils/Path.mjs"); var _execute = __webpack_require__(/*! ./execute.mjs */ "../../../node_modules/graphql/execution/execute.mjs"); +var _subscribe = __webpack_require__(/*! ./subscribe.mjs */ "../../../node_modules/graphql/execution/subscribe.mjs"); var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/graphql/execution/values.mjs"); /***/ }), -/***/ "../../../node_modules/graphql/execution/mapAsyncIterable.mjs": +/***/ "../../../node_modules/graphql/execution/mapAsyncIterator.mjs": /*!********************************************************************!*\ - !*** ../../../node_modules/graphql/execution/mapAsyncIterable.mjs ***! + !*** ../../../node_modules/graphql/execution/mapAsyncIterator.mjs ***! \********************************************************************/ /***/ (function(__unused_webpack_module, exports) { @@ -25400,12 +24210,12 @@ var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/gra Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.mapAsyncIterable = mapAsyncIterable; +exports.mapAsyncIterator = mapAsyncIterator; /** * Given an AsyncIterable and a callback function, return an AsyncIterator * which produces values mapped via calling the callback function. */ -function mapAsyncIterable(iterable, callback) { +function mapAsyncIterator(iterable, callback) { const iterator = iterable[Symbol.asyncIterator](); async function mapResult(result) { if (result.done) { @@ -25455,49 +24265,201 @@ function mapAsyncIterable(iterable, callback) { /***/ }), -/***/ "../../../node_modules/graphql/execution/types.mjs": -/*!*********************************************************!*\ - !*** ../../../node_modules/graphql/execution/types.mjs ***! - \*********************************************************/ -/***/ (function(__unused_webpack_module, exports) { +/***/ "../../../node_modules/graphql/execution/subscribe.mjs": +/*!*************************************************************!*\ + !*** ../../../node_modules/graphql/execution/subscribe.mjs ***! + \*************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DeferredFragmentRecord = void 0; -exports.isCancellableStreamRecord = isCancellableStreamRecord; -exports.isCompletedExecutionGroup = isCompletedExecutionGroup; -exports.isDeferredFragmentRecord = isDeferredFragmentRecord; -exports.isFailedExecutionGroup = isFailedExecutionGroup; -exports.isPendingExecutionGroup = isPendingExecutionGroup; -function isPendingExecutionGroup(incrementalDataRecord) { - return 'deferredFragmentRecords' in incrementalDataRecord; +exports.createSourceEventStream = createSourceEventStream; +exports.subscribe = subscribe; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +var _isAsyncIterable = __webpack_require__(/*! ../jsutils/isAsyncIterable.mjs */ "../../../node_modules/graphql/jsutils/isAsyncIterable.mjs"); +var _Path = __webpack_require__(/*! ../jsutils/Path.mjs */ "../../../node_modules/graphql/jsutils/Path.mjs"); +var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +var _locatedError = __webpack_require__(/*! ../error/locatedError.mjs */ "../../../node_modules/graphql/error/locatedError.mjs"); +var _collectFields = __webpack_require__(/*! ./collectFields.mjs */ "../../../node_modules/graphql/execution/collectFields.mjs"); +var _execute = __webpack_require__(/*! ./execute.mjs */ "../../../node_modules/graphql/execution/execute.mjs"); +var _mapAsyncIterator = __webpack_require__(/*! ./mapAsyncIterator.mjs */ "../../../node_modules/graphql/execution/mapAsyncIterator.mjs"); +var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/graphql/execution/values.mjs"); +/** + * Implements the "Subscribe" algorithm described in the GraphQL specification. + * + * Returns a Promise which resolves to either an AsyncIterator (if successful) + * or an ExecutionResult (error). The promise will be rejected if the schema or + * other arguments to this function are invalid, or if the resolved event stream + * is not an async iterable. + * + * If the client-provided arguments to this function do not result in a + * compliant subscription, a GraphQL Response (ExecutionResult) with + * descriptive errors and no data will be returned. + * + * If the source stream could not be created due to faulty subscription + * resolver logic or underlying systems, the promise will resolve to a single + * ExecutionResult containing `errors` and no `data`. + * + * If the operation succeeded, the promise resolves to an AsyncIterator, which + * yields a stream of ExecutionResults representing the response stream. + * + * Accepts either an object with named arguments, or individual arguments. + */ + +async function subscribe(args) { + // Temporary for v15 to v16 migration. Remove in v17 + arguments.length < 2 || (0, _devAssert.devAssert)(false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.'); + const resultOrStream = await createSourceEventStream(args); + if (!(0, _isAsyncIterable.isAsyncIterable)(resultOrStream)) { + return resultOrStream; + } // For each payload yielded from a subscription, map it over the normal + // GraphQL `execute` function, with `payload` as the rootValue. + // This implements the "MapSourceToResponseEvent" algorithm described in + // the GraphQL specification. The `execute` function provides the + // "ExecuteSubscriptionEvent" algorithm, as it is nearly identical to the + // "ExecuteQuery" algorithm, for which `execute` is also used. + + const mapSourceToResponse = payload => (0, _execute.execute)({ + ...args, + rootValue: payload + }); // Map every source value to a ExecutionResult value as described above. + + return (0, _mapAsyncIterator.mapAsyncIterator)(resultOrStream, mapSourceToResponse); } -function isCompletedExecutionGroup(subsequentResult) { - return 'pendingExecutionGroup' in subsequentResult; +function toNormalizedArgs(args) { + const firstArg = args[0]; + if (firstArg && 'document' in firstArg) { + return firstArg; + } + return { + schema: firstArg, + // FIXME: when underlying TS bug fixed, see https://github.com/microsoft/TypeScript/issues/31613 + document: args[1], + rootValue: args[2], + contextValue: args[3], + variableValues: args[4], + operationName: args[5], + subscribeFieldResolver: args[6] + }; } -function isFailedExecutionGroup(completedExecutionGroup) { - return completedExecutionGroup.errors !== undefined; -} -/** @internal */ -class DeferredFragmentRecord { - constructor(path, label, parent) { - this.path = path; - this.label = label; - this.parent = parent; - this.pendingExecutionGroups = new Set(); - this.successfulExecutionGroups = new Set(); - this.children = new Set(); +/** + * Implements the "CreateSourceEventStream" algorithm described in the + * GraphQL specification, resolving the subscription source event stream. + * + * Returns a Promise which resolves to either an AsyncIterable (if successful) + * or an ExecutionResult (error). The promise will be rejected if the schema or + * other arguments to this function are invalid, or if the resolved event stream + * is not an async iterable. + * + * If the client-provided arguments to this function do not result in a + * compliant subscription, a GraphQL Response (ExecutionResult) with + * descriptive errors and no data will be returned. + * + * If the the source stream could not be created due to faulty subscription + * resolver logic or underlying systems, the promise will resolve to a single + * ExecutionResult containing `errors` and no `data`. + * + * If the operation succeeded, the promise resolves to the AsyncIterable for the + * event stream returned by the resolver. + * + * A Source Event Stream represents a sequence of events, each of which triggers + * a GraphQL execution for that event. + * + * This may be useful when hosting the stateful subscription service in a + * different process or machine than the stateless GraphQL execution engine, + * or otherwise separating these two steps. For more on this, see the + * "Supporting Subscriptions at Scale" information in the GraphQL specification. + */ + +async function createSourceEventStream(...rawArgs) { + const args = toNormalizedArgs(rawArgs); + const { + schema, + document, + variableValues + } = args; // If arguments are missing or incorrectly typed, this is an internal + // developer mistake which should throw an early error. + + (0, _execute.assertValidExecutionArguments)(schema, document, variableValues); // If a valid execution context cannot be created due to incorrect arguments, + // a "Response" with only errors is returned. + + const exeContext = (0, _execute.buildExecutionContext)(args); // Return early errors if execution context failed. + + if (!('schema' in exeContext)) { + return { + errors: exeContext + }; + } + try { + const eventStream = await executeSubscription(exeContext); // Assert field returned an event stream, otherwise yield an error. + + if (!(0, _isAsyncIterable.isAsyncIterable)(eventStream)) { + throw new Error('Subscription field must return Async Iterable. ' + `Received: ${(0, _inspect.inspect)(eventStream)}.`); + } + return eventStream; + } catch (error) { + // If it GraphQLError, report it as an ExecutionResult, containing only errors and no data. + // Otherwise treat the error as a system-class error and re-throw it. + if (error instanceof _GraphQLError.GraphQLError) { + return { + errors: [error] + }; + } + throw error; } } -exports.DeferredFragmentRecord = DeferredFragmentRecord; -function isDeferredFragmentRecord(deliveryGroup) { - return deliveryGroup instanceof DeferredFragmentRecord; -} -function isCancellableStreamRecord(deliveryGroup) { - return 'earlyReturn' in deliveryGroup; +async function executeSubscription(exeContext) { + const { + schema, + fragments, + operation, + variableValues, + rootValue + } = exeContext; + const rootType = schema.getSubscriptionType(); + if (rootType == null) { + throw new _GraphQLError.GraphQLError('Schema is not configured to execute subscription operation.', { + nodes: operation + }); + } + const rootFields = (0, _collectFields.collectFields)(schema, fragments, variableValues, rootType, operation.selectionSet); + const [responseName, fieldNodes] = [...rootFields.entries()][0]; + const fieldDef = (0, _execute.getFieldDef)(schema, rootType, fieldNodes[0]); + if (!fieldDef) { + const fieldName = fieldNodes[0].name.value; + throw new _GraphQLError.GraphQLError(`The subscription field "${fieldName}" is not defined.`, { + nodes: fieldNodes + }); + } + const path = (0, _Path.addPath)(undefined, responseName, rootType.name); + const info = (0, _execute.buildResolveInfo)(exeContext, fieldDef, fieldNodes, rootType, path); + try { + var _fieldDef$subscribe; + + // Implements the "ResolveFieldEventStream" algorithm from GraphQL specification. + // It differs from "ResolveFieldValue" due to providing a different `resolveFn`. + // Build a JS object of arguments from the field.arguments AST, using the + // variables scope to fulfill any variable references. + const args = (0, _values.getArgumentValues)(fieldDef, fieldNodes[0], variableValues); // The resolve function's optional third argument is a context value that + // is provided to every resolve function within an execution. It is commonly + // used to represent an authenticated user, or request-specific caches. + + const contextValue = exeContext.contextValue; // Call the `subscribe()` resolver or the default resolver to produce an + // AsyncIterable yielding raw payloads. + + const resolveFn = (_fieldDef$subscribe = fieldDef.subscribe) !== null && _fieldDef$subscribe !== void 0 ? _fieldDef$subscribe : exeContext.subscribeFieldResolver; + const eventStream = await resolveFn(rootValue, args, contextValue, info); + if (eventStream instanceof Error) { + throw eventStream; + } + return eventStream; + } catch (error) { + throw (0, _locatedError.locatedError)(error, fieldNodes, (0, _Path.pathToArray)(path)); + } } /***/ }), @@ -25517,6 +24479,7 @@ exports.getArgumentValues = getArgumentValues; exports.getDirectiveValues = getDirectiveValues; exports.getVariableValues = getVariableValues; var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _printPathArray = __webpack_require__(/*! ../jsutils/printPathArray.mjs */ "../../../node_modules/graphql/jsutils/printPathArray.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); @@ -25570,7 +24533,7 @@ function coerceVariableValues(schema, varDefNodes, inputs, onError) { })); continue; } - if (!Object.hasOwn(inputs, varName)) { + if (!hasOwnProperty(inputs, varName)) { if (varDefNode.defaultValue) { coercedValues[varName] = (0, _valueFromAST.valueFromAST)(varDefNode.defaultValue, varType); } else if ((0, _definition.isNonNullType)(varType)) { @@ -25610,18 +24573,20 @@ function coerceVariableValues(schema, varDefNodes, inputs, onError) { * exposed to user code. Care should be taken to not pull values from the * Object prototype. */ + function getArgumentValues(def, node, variableValues) { var _node$arguments; - const coercedValues = {}; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const coercedValues = {}; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const argumentNodes = (_node$arguments = node.arguments) !== null && _node$arguments !== void 0 ? _node$arguments : []; - const argNodeMap = new Map(argumentNodes.map(arg => [arg.name.value, arg])); + const argNodeMap = (0, _keyMap.keyMap)(argumentNodes, arg => arg.name.value); for (const argDef of def.args) { const name = argDef.name; const argType = argDef.type; - const argumentNode = argNodeMap.get(name); - if (argumentNode == null) { + const argumentNode = argNodeMap[name]; + if (!argumentNode) { if (argDef.defaultValue !== undefined) { coercedValues[name] = argDef.defaultValue; } else if ((0, _definition.isNonNullType)(argType)) { @@ -25635,7 +24600,7 @@ function getArgumentValues(def, node, variableValues) { let isNull = valueNode.kind === _kinds.Kind.NULL; if (valueNode.kind === _kinds.Kind.VARIABLE) { const variableName = valueNode.name.value; - if (variableValues == null || !Object.hasOwn(variableValues, variableName)) { + if (variableValues == null || !hasOwnProperty(variableValues, variableName)) { if (argDef.defaultValue !== undefined) { coercedValues[name] = argDef.defaultValue; } else if ((0, _definition.isNonNullType)(argType)) { @@ -25676,6 +24641,7 @@ function getArgumentValues(def, node, variableValues) { * exposed to user code. Care should be taken to not pull values from the * Object prototype. */ + function getDirectiveValues(directiveDef, node, variableValues) { var _node$directives; const directiveNode = (_node$directives = node.directives) === null || _node$directives === void 0 ? void 0 : _node$directives.find(directive => directive.name.value === directiveDef.name); @@ -25683,6 +24649,9 @@ function getDirectiveValues(directiveDef, node, variableValues) { return getArgumentValues(directiveDef, directiveNode, variableValues); } } +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} /***/ }), @@ -25699,11 +24668,52 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.graphql = graphql; exports.graphqlSync = graphqlSync; +var _devAssert = __webpack_require__(/*! ./jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _isPromise = __webpack_require__(/*! ./jsutils/isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); var _parser = __webpack_require__(/*! ./language/parser.mjs */ "../../../node_modules/graphql/language/parser.mjs"); var _validate = __webpack_require__(/*! ./type/validate.mjs */ "../../../node_modules/graphql/type/validate.mjs"); var _validate2 = __webpack_require__(/*! ./validation/validate.mjs */ "../../../node_modules/graphql/validation/validate.mjs"); var _execute = __webpack_require__(/*! ./execution/execute.mjs */ "../../../node_modules/graphql/execution/execute.mjs"); +/** + * This is the primary entry point function for fulfilling GraphQL operations + * by parsing, validating, and executing a GraphQL document along side a + * GraphQL schema. + * + * More sophisticated GraphQL servers, such as those which persist queries, + * may wish to separate the validation and execution phases to a static time + * tooling step, and a server runtime step. + * + * Accepts either an object with named arguments, or individual arguments: + * + * schema: + * The GraphQL type system to use when validating and executing a query. + * source: + * A GraphQL language formatted string representing the requested operation. + * rootValue: + * The value provided as the first argument to resolver functions on the top + * level type (e.g. the query object type). + * contextValue: + * The context value is provided as an argument to resolver functions after + * field arguments. It is used to pass shared information useful at any point + * during executing this query, for example the currently logged in user and + * connections to databases or other services. + * variableValues: + * A mapping of variable name to runtime value to use for all variables + * defined in the requestString. + * operationName: + * The name of the operation to use if requestString contains multiple + * possible operations. Can be omitted if requestString contains only + * one operation. + * fieldResolver: + * A resolver function to use when one is not provided by the schema. + * If not provided, the default field resolver is used (which looks for a + * value or method on the source value with the field's name). + * typeResolver: + * A type resolver function to use when none is provided by the schema. + * If not provided, the default type resolver is used (which looks for a + * `__typename` field or alternatively calls the `isTypeOf` method). + */ + function graphql(args) { // Always return a Promise for a consistent API. return new Promise(resolve => resolve(graphqlImpl(args))); @@ -25714,15 +24724,18 @@ function graphql(args) { * However, it guarantees to complete synchronously (or throw an error) assuming * that all field resolvers are also synchronous. */ + function graphqlSync(args) { - const result = graphqlImpl(args); - // Assert that the execution was synchronous. + const result = graphqlImpl(args); // Assert that the execution was synchronous. + if ((0, _isPromise.isPromise)(result)) { throw new Error('GraphQL execution failed to complete synchronously.'); } return result; } function graphqlImpl(args) { + // Temporary for v15 to v16 migration. Remove in v17 + arguments.length < 2 || (0, _devAssert.devAssert)(false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.'); const { schema, source, @@ -25732,15 +24745,15 @@ function graphqlImpl(args) { operationName, fieldResolver, typeResolver - } = args; - // Validate Schema + } = args; // Validate Schema + const schemaValidationErrors = (0, _validate.validateSchema)(schema); if (schemaValidationErrors.length > 0) { return { errors: schemaValidationErrors }; - } - // Parse + } // Parse + let document; try { document = (0, _parser.parse)(source); @@ -25748,15 +24761,15 @@ function graphqlImpl(args) { return { errors: [syntaxError] }; - } - // Validate + } // Validate + const validationErrors = (0, _validate2.validate)(schema, document); if (validationErrors.length > 0) { return { errors: validationErrors }; - } - // Execute + } // Execute + return (0, _execute.execute)({ schema, document, @@ -25848,12 +24861,6 @@ Object.defineProperty(exports, "GraphQLBoolean", ({ return _index.GraphQLBoolean; } })); -Object.defineProperty(exports, "GraphQLDeferDirective", ({ - enumerable: true, - get: function () { - return _index.GraphQLDeferDirective; - } -})); Object.defineProperty(exports, "GraphQLDeprecatedDirective", ({ enumerable: true, get: function () { @@ -25962,12 +24969,6 @@ Object.defineProperty(exports, "GraphQLSpecifiedByDirective", ({ return _index.GraphQLSpecifiedByDirective; } })); -Object.defineProperty(exports, "GraphQLStreamDirective", ({ - enumerable: true, - get: function () { - return _index.GraphQLStreamDirective; - } -})); Object.defineProperty(exports, "GraphQLString", ({ enumerable: true, get: function () { @@ -26430,6 +25431,12 @@ Object.defineProperty(exports, "assertUnionType", ({ return _index.assertUnionType; } })); +Object.defineProperty(exports, "assertValidName", ({ + enumerable: true, + get: function () { + return _index6.assertValidName; + } +})); Object.defineProperty(exports, "assertValidSchema", ({ enumerable: true, get: function () { @@ -26514,12 +25521,6 @@ Object.defineProperty(exports, "executeSync", ({ return _index3.executeSync; } })); -Object.defineProperty(exports, "experimentalExecuteIncrementally", ({ - enumerable: true, - get: function () { - return _index3.experimentalExecuteIncrementally; - } -})); Object.defineProperty(exports, "extendSchema", ({ enumerable: true, get: function () { @@ -26538,6 +25539,12 @@ Object.defineProperty(exports, "findDangerousChanges", ({ return _index6.findDangerousChanges; } })); +Object.defineProperty(exports, "formatError", ({ + enumerable: true, + get: function () { + return _index5.formatError; + } +})); Object.defineProperty(exports, "getArgumentValues", ({ enumerable: true, get: function () { @@ -26586,12 +25593,24 @@ Object.defineProperty(exports, "getOperationAST", ({ return _index6.getOperationAST; } })); +Object.defineProperty(exports, "getOperationRootType", ({ + enumerable: true, + get: function () { + return _index6.getOperationRootType; + } +})); Object.defineProperty(exports, "getVariableValues", ({ enumerable: true, get: function () { return _index3.getVariableValues; } })); +Object.defineProperty(exports, "getVisitFn", ({ + enumerable: true, + get: function () { + return _index2.getVisitFn; + } +})); Object.defineProperty(exports, "graphql", ({ enumerable: true, get: function () { @@ -26712,12 +25731,6 @@ Object.defineProperty(exports, "isNonNullType", ({ return _index.isNonNullType; } })); -Object.defineProperty(exports, "isNullabilityAssertionNode", ({ - enumerable: true, - get: function () { - return _index2.isNullabilityAssertionNode; - } -})); Object.defineProperty(exports, "isNullableType", ({ enumerable: true, get: function () { @@ -26826,6 +25839,12 @@ Object.defineProperty(exports, "isUnionType", ({ return _index.isUnionType; } })); +Object.defineProperty(exports, "isValidNameError", ({ + enumerable: true, + get: function () { + return _index6.isValidNameError; + } +})); Object.defineProperty(exports, "isValueNode", ({ enumerable: true, get: function () { @@ -26880,10 +25899,10 @@ Object.defineProperty(exports, "print", ({ return _index2.print; } })); -Object.defineProperty(exports, "printDirective", ({ +Object.defineProperty(exports, "printError", ({ enumerable: true, get: function () { - return _index6.printDirective; + return _index5.printError; } })); Object.defineProperty(exports, "printIntrospectionSchema", ({ @@ -27053,76 +26072,6 @@ var _index6 = __webpack_require__(/*! ./utilities/index.mjs */ "../../../node_mo /***/ }), -/***/ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs": -/*!****************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/AccumulatorMap.mjs ***! - \****************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.AccumulatorMap = void 0; -/** - * ES6 Map with additional `add` method to accumulate items. - */ -class AccumulatorMap extends Map { - get [Symbol.toStringTag]() { - return 'AccumulatorMap'; - } - add(key, item) { - const group = this.get(key); - if (group === undefined) { - this.set(key, [item]); - } else { - group.push(item); - } - } -} -exports.AccumulatorMap = AccumulatorMap; - -/***/ }), - -/***/ "../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs": -/*!*********************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs ***! - \*********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.BoxedPromiseOrValue = void 0; -var _isPromise = __webpack_require__(/*! ./isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); -/** - * A BoxedPromiseOrValue is a container for a value or promise where the value - * will be updated when the promise resolves. - * - * A BoxedPromiseOrValue may only be used with promises whose possible - * rejection has already been handled, otherwise this will lead to unhandled - * promise rejections. - * - * @internal - * */ -class BoxedPromiseOrValue { - constructor(value) { - this.value = value; - if ((0, _isPromise.isPromise)(value)) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - value.then(resolved => { - this.value = resolved; - }); - } - } -} -exports.BoxedPromiseOrValue = BoxedPromiseOrValue; - -/***/ }), - /***/ "../../../node_modules/graphql/jsutils/Path.mjs": /*!******************************************************!*\ !*** ../../../node_modules/graphql/jsutils/Path.mjs ***! @@ -27149,6 +26098,7 @@ function addPath(prev, key, typename) { /** * Given a Path, return an Array of the path keys. */ + function pathToArray(path) { const flattened = []; let curr = path; @@ -27161,27 +26111,6 @@ function pathToArray(path) { /***/ }), -/***/ "../../../node_modules/graphql/jsutils/capitalize.mjs": -/*!************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/capitalize.mjs ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.capitalize = capitalize; -/** - * Converts the first character of string to upper case and the remaining to lower case. - */ -function capitalize(str) { - return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); -} - -/***/ }), - /***/ "../../../node_modules/graphql/jsutils/devAssert.mjs": /*!***********************************************************!*\ !*** ../../../node_modules/graphql/jsutils/devAssert.mjs ***! @@ -27195,7 +26124,8 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.devAssert = devAssert; function devAssert(condition, message) { - if (!condition) { + const booleanCondition = Boolean(condition); + if (!booleanCondition) { throw new Error(message); } } @@ -27206,7 +26136,7 @@ function devAssert(condition, message) { /*!************************************************************!*\ !*** ../../../node_modules/graphql/jsutils/didYouMean.mjs ***! \************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ (function(__unused_webpack_module, exports) { @@ -27214,84 +26144,29 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.didYouMean = didYouMean; -var _formatList = __webpack_require__(/*! ./formatList.mjs */ "../../../node_modules/graphql/jsutils/formatList.mjs"); const MAX_SUGGESTIONS = 5; +/** + * Given [ A, B, C ] return ' Did you mean A, B, or C?'. + */ + function didYouMean(firstArg, secondArg) { - const [subMessage, suggestions] = secondArg ? [firstArg, secondArg] : [undefined, firstArg]; - if (suggestions.length === 0) { - return ''; - } + const [subMessage, suggestionsArg] = secondArg ? [firstArg, secondArg] : [undefined, firstArg]; let message = ' Did you mean '; - if (subMessage != null) { + if (subMessage) { message += subMessage + ' '; } - const suggestionList = (0, _formatList.orList)(suggestions.slice(0, MAX_SUGGESTIONS).map(x => `"${x}"`)); - return message + suggestionList + '?'; -} - -/***/ }), - -/***/ "../../../node_modules/graphql/jsutils/formatList.mjs": -/*!************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/formatList.mjs ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.andList = andList; -exports.orList = orList; -var _invariant = __webpack_require__(/*! ./invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -/** - * Given [ A, B, C ] return 'A, B, or C'. - */ -function orList(items) { - return formatList('or', items); -} -/** - * Given [ A, B, C ] return 'A, B, and C'. - */ -function andList(items) { - return formatList('and', items); -} -function formatList(conjunction, items) { - items.length !== 0 || (0, _invariant.invariant)(false); - switch (items.length) { + const suggestions = suggestionsArg.map(x => `"${x}"`); + switch (suggestions.length) { + case 0: + return ''; case 1: - return items[0]; + return message + suggestions[0] + '?'; case 2: - return items[0] + ' ' + conjunction + ' ' + items[1]; + return message + suggestions[0] + ' or ' + suggestions[1] + '?'; } - const allButLast = items.slice(0, -1); - const lastItem = items.at(-1); - return allButLast.join(', ') + ', ' + conjunction + ' ' + lastItem; -} - -/***/ }), - -/***/ "../../../node_modules/graphql/jsutils/getBySet.mjs": -/*!**********************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/getBySet.mjs ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getBySet = getBySet; -var _isSameSet = __webpack_require__(/*! ./isSameSet.mjs */ "../../../node_modules/graphql/jsutils/isSameSet.mjs"); -function getBySet(map, setToMatch) { - for (const set of map.keys()) { - if ((0, _isSameSet.isSameSet)(set, setToMatch)) { - return map.get(set); - } - } - return undefined; + const selected = suggestions.slice(0, MAX_SUGGESTIONS); + const lastItem = selected.pop(); + return message + selected.join(', ') + ', or ' + lastItem + '?'; } /***/ }), @@ -27300,7 +26175,7 @@ function getBySet(map, setToMatch) { /*!*********************************************************!*\ !*** ../../../node_modules/graphql/jsutils/groupBy.mjs ***! \*********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ (function(__unused_webpack_module, exports) { @@ -27308,14 +26183,19 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.groupBy = groupBy; -var _AccumulatorMap = __webpack_require__(/*! ./AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); /** * Groups array items into a Map, given a function to produce grouping key. */ function groupBy(list, keyFn) { - const result = new _AccumulatorMap.AccumulatorMap(); + const result = new Map(); for (const item of list) { - result.add(keyFn(item), item); + const key = keyFn(item); + const group = result.get(key); + if (group === undefined) { + result.set(key, [item]); + } else { + group.push(item); + } } return result; } @@ -27360,6 +26240,7 @@ const MAX_RECURSIVE_DEPTH = 2; /** * Used to print values in error messages. */ + function inspect(value) { return formatValue(value, []); } @@ -27384,8 +26265,8 @@ function formatObjectValue(value, previouslySeenValues) { } const seenValues = [...previouslySeenValues, value]; if (isJSONable(value)) { - const jsonValue = value.toJSON(); - // check for infinite recursion + const jsonValue = value.toJSON(); // check for infinite recursion + if (jsonValue !== value) { return typeof jsonValue === 'string' ? jsonValue : formatValue(jsonValue, seenValues); } @@ -27454,15 +26335,21 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.instanceOf = void 0; var _inspect = __webpack_require__(/*! ./inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +/* c8 ignore next 3 */ + +const isProduction = globalThis.process && +// eslint-disable-next-line no-undef +"development" === 'production'; /** * A replacement for instanceof which includes an error warning when multi-realm * constructors are detected. * See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production * See: https://webpack.js.org/guides/production/ */ + const instanceOf = exports.instanceOf = /* c8 ignore next 6 */ // FIXME: https://github.com/graphql/graphql-js/issues/2317 -globalThis.process != null && globalThis.process.env.NODE_ENV === 'production' ? function instanceOf(value, constructor) { +isProduction ? function instanceOf(value, constructor) { return value instanceof constructor; } : function instanceOf(value, constructor) { if (value instanceof constructor) { @@ -27470,11 +26357,13 @@ globalThis.process != null && globalThis.process.env.NODE_ENV === 'production' ? } if (typeof value === 'object' && value !== null) { var _value$constructor; + // Prefer Symbol.toStringTag since it is immune to minification. const className = constructor.prototype[Symbol.toStringTag]; const valueClassName = // We still need to support constructor's name to detect conflicts with older versions of this library. - Symbol.toStringTag in value ? value[Symbol.toStringTag] : (_value$constructor = value.constructor) === null || _value$constructor === void 0 ? void 0 : _value$constructor.name; + Symbol.toStringTag in value // @ts-expect-error TS bug see, https://github.com/microsoft/TypeScript/issues/38009 + ? value[Symbol.toStringTag] : (_value$constructor = value.constructor) === null || _value$constructor === void 0 ? void 0 : _value$constructor.name; if (className === valueClassName) { const stringifiedValue = (0, _inspect.inspect)(value); throw new Error(`Cannot use ${className} "${stringifiedValue}" from another module or realm. @@ -27509,7 +26398,8 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.invariant = invariant; function invariant(condition, message) { - if (!condition) { + const booleanCondition = Boolean(condition); + if (!booleanCondition) { throw new Error(message != null ? message : 'Unexpected invariant triggered.'); } } @@ -27617,32 +26507,6 @@ function isPromise(value) { /***/ }), -/***/ "../../../node_modules/graphql/jsutils/isSameSet.mjs": -/*!***********************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/isSameSet.mjs ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isSameSet = isSameSet; -function isSameSet(setA, setB) { - if (setA.size !== setB.size) { - return false; - } - for (const item of setA) { - if (!setB.has(item)) { - return false; - } - } - return true; -} - -/***/ }), - /***/ "../../../node_modules/graphql/jsutils/keyMap.mjs": /*!********************************************************!*\ !*** ../../../node_modules/graphql/jsutils/keyMap.mjs ***! @@ -27904,15 +26768,14 @@ exports.promiseForObject = promiseForObject; * This is akin to bluebird's `Promise.props`, but implemented only using * `Promise.all` so it will work with any implementation of ES6 promises. */ -async function promiseForObject(object, callback) { - const keys = Object.keys(object); - const values = Object.values(object); - const resolvedValues = await Promise.all(values); - const resolvedObject = Object.create(null); - for (let i = 0; i < keys.length; ++i) { - resolvedObject[keys[i]] = resolvedValues[i]; - } - return callback(resolvedObject); +function promiseForObject(object) { + return Promise.all(Object.values(object)).then(resolvedValues => { + const resolvedObject = Object.create(null); + for (const [i, key] of Object.keys(object).entries()) { + resolvedObject[key] = resolvedValues[i]; + } + return resolvedObject; + }); } /***/ }), @@ -27947,39 +26810,6 @@ function promiseReduce(values, callbackFn, initialValue) { /***/ }), -/***/ "../../../node_modules/graphql/jsutils/promiseWithResolvers.mjs": -/*!**********************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/promiseWithResolvers.mjs ***! - \**********************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.promiseWithResolvers = promiseWithResolvers; -/** - * Based on Promise.withResolvers proposal - * https://github.com/tc39/proposal-promise-with-resolvers - */ -function promiseWithResolvers() { - // these are assigned synchronously within the Promise constructor - let resolve; - let reject; - const promise = new Promise((res, rej) => { - resolve = res; - reject = rej; - }); - return { - promise, - resolve, - reject - }; -} - -/***/ }), - /***/ "../../../node_modules/graphql/jsutils/suggestionList.mjs": /*!****************************************************************!*\ !*** ../../../node_modules/graphql/jsutils/suggestionList.mjs ***! @@ -27997,6 +26827,7 @@ var _naturalCompare = __webpack_require__(/*! ./naturalCompare.mjs */ "../../../ * Given an invalid input string and a list of valid options, returns a filtered * list of valid options sorted based on their similarity with the input. */ + function suggestionList(input, options) { const optionsByDistance = Object.create(null); const lexicalDistance = new LexicalDistance(input); @@ -28026,6 +26857,7 @@ function suggestionList(input, options) { * * This distance can be useful for detecting typos in input or sorting */ + class LexicalDistance { constructor(input) { this._input = input; @@ -28037,8 +26869,8 @@ class LexicalDistance { if (this._input === option) { return 0; } - const optionLowerCase = option.toLowerCase(); - // Any case change counts as a single edit + const optionLowerCase = option.toLowerCase(); // Any case change counts as a single edit + if (this._inputLowerCase === optionLowerCase) { return 1; } @@ -28068,7 +26900,8 @@ class LexicalDistance { // delete currentRow[j - 1] + 1, // insert - upRow[j - 1] + cost); + upRow[j - 1] + cost // substitute + ); if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) { // transposition const doubleDiagonalCell = rows[(i - 2) % 3][j - 2]; @@ -28078,8 +26911,8 @@ class LexicalDistance { smallestCell = currentCell; } currentRow[j] = currentCell; - } - // Early exit, since distance can't go smaller than smallest element of the previous row. + } // Early exit, since distance can't go smaller than smallest element of the previous row. + if (smallestCell > threshold) { return undefined; } @@ -28115,6 +26948,7 @@ var _inspect = __webpack_require__(/*! ./inspect.mjs */ "../../../node_modules/g /** * Sometimes a non-error is thrown, wrap it as an Error instance to ensure a consistent Error interface. */ + function toError(thrownValue) { return thrownValue instanceof Error ? thrownValue : new NonErrorThrown(thrownValue); } @@ -28174,6 +27008,25 @@ exports.isNode = isNode; * identify the region of the source from which the AST derived. */ class Location { + /** + * The character offset at which this Node begins. + */ + + /** + * The character offset at which this Node ends. + */ + + /** + * The Token at which this Node begins. + */ + + /** + * The Token at which this Node ends. + */ + + /** + * The Source document the AST represents. + */ constructor(startToken, endToken, source) { this.start = startToken.start; this.end = endToken.end; @@ -28197,14 +27050,45 @@ class Location { */ exports.Location = Location; class Token { - // eslint-disable-next-line max-params + /** + * The kind of Token. + */ + + /** + * The character offset at which this Node begins. + */ + + /** + * The character offset at which this Node ends. + */ + + /** + * The 1-indexed line number on which this Token appears. + */ + + /** + * The 1-indexed column number at which this Token begins. + */ + + /** + * For non-punctuation tokens, represents the interpreted value of the token. + * + * Note: is undefined for punctuation tokens, but typed as string for + * convenience in the parser. + */ + + /** + * Tokens exist as nodes in a double-linked-list amongst all tokens + * including ignored tokens. is always the first node and + * the last. + */ constructor(kind, start, end, line, column, value) { this.kind = kind; this.start = start; this.end = end; this.line = line; - this.column = column; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.column = column; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.value = value; this.prev = null; this.next = null; @@ -28221,6 +27105,10 @@ class Token { }; } } +/** + * The list of all possible AST node types. + */ + /** * @internal */ @@ -28232,16 +27120,8 @@ const QueryDocumentKeys = exports.QueryDocumentKeys = { VariableDefinition: ['variable', 'type', 'defaultValue', 'directives'], Variable: ['name'], SelectionSet: ['selections'], - Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet', - // Note: Client Controlled Nullability is experimental and may be changed - // or removed in the future. - 'nullabilityAssertion'], + Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet'], Argument: ['name', 'value'], - // Note: Client Controlled Nullability is experimental and may be changed - // or removed in the future. - ListNullabilityOperator: ['nullabilityAssertion'], - NonNullAssertion: ['nullabilityAssertion'], - ErrorBoundary: ['nullabilityAssertion'], FragmentSpread: ['name', 'directives'], InlineFragment: ['typeCondition', 'directives', 'selectionSet'], FragmentDefinition: ['name', @@ -28284,10 +27164,13 @@ const kindValues = new Set(Object.keys(QueryDocumentKeys)); /** * @internal */ + function isNode(maybeNode) { const maybeKind = maybeNode === null || maybeNode === void 0 ? void 0 : maybeNode.kind; return typeof maybeKind === 'string' && kindValues.has(maybeKind); } +/** Name */ + var OperationTypeNode; (function (OperationTypeNode) { OperationTypeNode['QUERY'] = 'query'; @@ -28320,28 +27203,28 @@ var _characterClasses = __webpack_require__(/*! ./characterClasses.mjs */ "../.. * * @internal */ + function dedentBlockStringLines(lines) { - var _firstNonEmptyLine; + var _firstNonEmptyLine2; let commonIndent = Number.MAX_SAFE_INTEGER; let firstNonEmptyLine = null; let lastNonEmptyLine = -1; for (let i = 0; i < lines.length; ++i) { + var _firstNonEmptyLine; const line = lines[i]; const indent = leadingWhitespace(line); if (indent === line.length) { continue; // skip empty lines } - firstNonEmptyLine ??= i; + firstNonEmptyLine = (_firstNonEmptyLine = firstNonEmptyLine) !== null && _firstNonEmptyLine !== void 0 ? _firstNonEmptyLine : i; lastNonEmptyLine = i; if (i !== 0 && indent < commonIndent) { commonIndent = indent; } } - return lines - // Remove common indentation from all lines but first. - .map((line, i) => i === 0 ? line : line.slice(commonIndent)) - // Remove leading and trailing blank lines. - .slice((_firstNonEmptyLine = firstNonEmptyLine) !== null && _firstNonEmptyLine !== void 0 ? _firstNonEmptyLine : 0, lastNonEmptyLine + 1); + return lines // Remove common indentation from all lines but first. + .map((line, i) => i === 0 ? line : line.slice(commonIndent)) // Remove leading and trailing blank lines. + .slice((_firstNonEmptyLine2 = firstNonEmptyLine) !== null && _firstNonEmptyLine2 !== void 0 ? _firstNonEmptyLine2 : 0, lastNonEmptyLine + 1); } function leadingWhitespace(str) { let i = 0; @@ -28353,6 +27236,7 @@ function leadingWhitespace(str) { /** * @internal */ + function isPrintableAsBlockString(value) { if (value === '') { return true; // empty string is printable @@ -28378,10 +27262,12 @@ function isPrintableAsBlockString(value) { case 0x000f: return false; // Has non-printable characters + case 0x000d: // \r return false; // Has \r or \r\n which will be replaced as \n + case 10: // \n if (isEmptyLine && !seenNonEmptyLine) { @@ -28392,12 +27278,13 @@ function isPrintableAsBlockString(value) { hasIndent = false; break; case 9: // \t + case 32: // - hasIndent ||= isEmptyLine; + hasIndent || (hasIndent = isEmptyLine); break; default: - hasCommonIndent &&= hasIndent; + hasCommonIndent && (hasCommonIndent = hasIndent); isEmptyLine = false; } } @@ -28416,24 +27303,25 @@ function isPrintableAsBlockString(value) { * * @internal */ + function printBlockString(value, options) { - const escapedValue = value.replaceAll('"""', '\\"""'); - // Expand a block string's raw value into independent lines. + const escapedValue = value.replace(/"""/g, '\\"""'); // Expand a block string's raw value into independent lines. + const lines = escapedValue.split(/\r\n|[\n\r]/g); - const isSingleLine = lines.length === 1; - // If common indentation is found we can fix some of those cases by adding leading new line - const forceLeadingNewLine = lines.length > 1 && lines.slice(1).every(line => line.length === 0 || (0, _characterClasses.isWhiteSpace)(line.charCodeAt(0))); - // Trailing triple quotes just looks confusing but doesn't force trailing new line - const hasTrailingTripleQuotes = escapedValue.endsWith('\\"""'); - // Trailing quote (single or double) or slash forces trailing new line + const isSingleLine = lines.length === 1; // If common indentation is found we can fix some of those cases by adding leading new line + + const forceLeadingNewLine = lines.length > 1 && lines.slice(1).every(line => line.length === 0 || (0, _characterClasses.isWhiteSpace)(line.charCodeAt(0))); // Trailing triple quotes just looks confusing but doesn't force trailing new line + + const hasTrailingTripleQuotes = escapedValue.endsWith('\\"""'); // Trailing quote (single or double) or slash forces trailing new line + const hasTrailingQuote = value.endsWith('"') && !hasTrailingTripleQuotes; const hasTrailingSlash = value.endsWith('\\'); const forceTrailingNewline = hasTrailingQuote || hasTrailingSlash; const printAsMultipleLines = !(options !== null && options !== void 0 && options.minimize) && ( // add leading and trailing new lines only if it improves readability !isSingleLine || value.length > 70 || forceTrailingNewline || forceLeadingNewLine || hasTrailingTripleQuotes); - let result = ''; - // Format a multi-line block quote to account for leading space. + let result = ''; // Format a multi-line block quote to account for leading space. + const skipLeadingNewLine = isSingleLine && (0, _characterClasses.isWhiteSpace)(value.charCodeAt(0)); if (printAsMultipleLines && !skipLeadingNewLine || forceLeadingNewLine) { result += '\n'; @@ -28481,6 +27369,7 @@ function isWhiteSpace(code) { * ``` * @internal */ + function isDigit(code) { return code >= 0x0030 && code <= 0x0039; } @@ -28494,6 +27383,7 @@ function isDigit(code) { * ``` * @internal */ + function isLetter(code) { return code >= 0x0061 && code <= 0x007a || // A-Z @@ -28508,6 +27398,7 @@ function isLetter(code) { * ``` * @internal */ + function isNameStart(code) { return isLetter(code) || code === 0x005f; } @@ -28520,6 +27411,7 @@ function isNameStart(code) { * ``` * @internal */ + function isNameContinue(code) { return isLetter(code) || isDigit(code) || code === 0x005f; } @@ -28543,7 +27435,6 @@ exports.DirectiveLocation = void 0; */ var DirectiveLocation; (function (DirectiveLocation) { - /** Request Definitions */ DirectiveLocation['QUERY'] = 'QUERY'; DirectiveLocation['MUTATION'] = 'MUTATION'; DirectiveLocation['SUBSCRIPTION'] = 'SUBSCRIPTION'; @@ -28552,7 +27443,6 @@ var DirectiveLocation; DirectiveLocation['FRAGMENT_SPREAD'] = 'FRAGMENT_SPREAD'; DirectiveLocation['INLINE_FRAGMENT'] = 'INLINE_FRAGMENT'; DirectiveLocation['VARIABLE_DEFINITION'] = 'VARIABLE_DEFINITION'; - /** Type System Definitions */ DirectiveLocation['SCHEMA'] = 'SCHEMA'; DirectiveLocation['SCALAR'] = 'SCALAR'; DirectiveLocation['OBJECT'] = 'OBJECT'; @@ -28566,6 +27456,12 @@ var DirectiveLocation; DirectiveLocation['INPUT_FIELD_DEFINITION'] = 'INPUT_FIELD_DEFINITION'; })(DirectiveLocation || (exports.DirectiveLocation = DirectiveLocation = {})); +/** + * The enum type representing the directive location values. + * + * @deprecated Please use `DirectiveLocation`. Will be remove in v17. + */ + /***/ }), /***/ "../../../node_modules/graphql/language/index.mjs": @@ -28645,6 +27541,12 @@ Object.defineProperty(exports, "getLocation", ({ return _location.getLocation; } })); +Object.defineProperty(exports, "getVisitFn", ({ + enumerable: true, + get: function () { + return _visitor.getVisitFn; + } +})); Object.defineProperty(exports, "isConstValueNode", ({ enumerable: true, get: function () { @@ -28663,12 +27565,6 @@ Object.defineProperty(exports, "isExecutableDefinitionNode", ({ return _predicates.isExecutableDefinitionNode; } })); -Object.defineProperty(exports, "isNullabilityAssertionNode", ({ - enumerable: true, - get: function () { - return _predicates.isNullabilityAssertionNode; - } -})); Object.defineProperty(exports, "isSelectionNode", ({ enumerable: true, get: function () { @@ -28797,24 +27693,16 @@ exports.Kind = void 0; */ var Kind; (function (Kind) { - /** Name */ Kind['NAME'] = 'Name'; - /** Document */ Kind['DOCUMENT'] = 'Document'; Kind['OPERATION_DEFINITION'] = 'OperationDefinition'; Kind['VARIABLE_DEFINITION'] = 'VariableDefinition'; Kind['SELECTION_SET'] = 'SelectionSet'; Kind['FIELD'] = 'Field'; Kind['ARGUMENT'] = 'Argument'; - /** Nullability Modifiers */ - Kind['LIST_NULLABILITY_OPERATOR'] = 'ListNullabilityOperator'; - Kind['NON_NULL_ASSERTION'] = 'NonNullAssertion'; - Kind['ERROR_BOUNDARY'] = 'ErrorBoundary'; - /** Fragments */ Kind['FRAGMENT_SPREAD'] = 'FragmentSpread'; Kind['INLINE_FRAGMENT'] = 'InlineFragment'; Kind['FRAGMENT_DEFINITION'] = 'FragmentDefinition'; - /** Values */ Kind['VARIABLE'] = 'Variable'; Kind['INT'] = 'IntValue'; Kind['FLOAT'] = 'FloatValue'; @@ -28825,16 +27713,12 @@ var Kind; Kind['LIST'] = 'ListValue'; Kind['OBJECT'] = 'ObjectValue'; Kind['OBJECT_FIELD'] = 'ObjectField'; - /** Directives */ Kind['DIRECTIVE'] = 'Directive'; - /** Types */ Kind['NAMED_TYPE'] = 'NamedType'; Kind['LIST_TYPE'] = 'ListType'; Kind['NON_NULL_TYPE'] = 'NonNullType'; - /** Type System Definitions */ Kind['SCHEMA_DEFINITION'] = 'SchemaDefinition'; Kind['OPERATION_TYPE_DEFINITION'] = 'OperationTypeDefinition'; - /** Type Definitions */ Kind['SCALAR_TYPE_DEFINITION'] = 'ScalarTypeDefinition'; Kind['OBJECT_TYPE_DEFINITION'] = 'ObjectTypeDefinition'; Kind['FIELD_DEFINITION'] = 'FieldDefinition'; @@ -28844,11 +27728,8 @@ var Kind; Kind['ENUM_TYPE_DEFINITION'] = 'EnumTypeDefinition'; Kind['ENUM_VALUE_DEFINITION'] = 'EnumValueDefinition'; Kind['INPUT_OBJECT_TYPE_DEFINITION'] = 'InputObjectTypeDefinition'; - /** Directive Definitions */ Kind['DIRECTIVE_DEFINITION'] = 'DirectiveDefinition'; - /** Type System Extensions */ Kind['SCHEMA_EXTENSION'] = 'SchemaExtension'; - /** Type Extensions */ Kind['SCALAR_TYPE_EXTENSION'] = 'ScalarTypeExtension'; Kind['OBJECT_TYPE_EXTENSION'] = 'ObjectTypeExtension'; Kind['INTERFACE_TYPE_EXTENSION'] = 'InterfaceTypeExtension'; @@ -28857,6 +27738,12 @@ var Kind; Kind['INPUT_OBJECT_TYPE_EXTENSION'] = 'InputObjectTypeExtension'; })(Kind || (exports.Kind = Kind = {})); +/** + * The enum type representing the possible kind values of AST nodes. + * + * @deprecated Please use `Kind`. Will be remove in v17. + */ + /***/ }), /***/ "../../../node_modules/graphql/language/lexer.mjs": @@ -28885,7 +27772,23 @@ var _tokenKind = __webpack_require__(/*! ./tokenKind.mjs */ "../../../node_modul * EOF, after which the lexer will repeatedly return the same EOF token * whenever called. */ + class Lexer { + /** + * The previously focused non-ignored token. + */ + + /** + * The currently focused non-ignored token. + */ + + /** + * The (1-indexed) line containing the current token. + */ + + /** + * The character offset at which the current line begins. + */ constructor(source) { const startOfFileToken = new _ast.Token(_tokenKind.TokenKind.SOF, 0, 0, 0, 0); this.source = source; @@ -28900,6 +27803,7 @@ class Lexer { /** * Advances the token stream to the next non-ignored token. */ + advance() { this.lastToken = this.token; const token = this.token = this.lookahead(); @@ -28909,6 +27813,7 @@ class Lexer { * Looks ahead and returns the next non-ignored token, but does not change * the state of Lexer. */ + lookahead() { let token = this.token; if (token.kind !== _tokenKind.TokenKind.EOF) { @@ -28917,10 +27822,10 @@ class Lexer { token = token.next; } else { // Read the next token and form a link in the token linked-list. - const nextToken = readNextToken(this, token.end); - // @ts-expect-error next is only mutable during parsing. - token.next = nextToken; - // @ts-expect-error prev is only mutable during parsing. + const nextToken = readNextToken(this, token.end); // @ts-expect-error next is only mutable during parsing. + + token.next = nextToken; // @ts-expect-error prev is only mutable during parsing. + nextToken.prev = token; token = nextToken; } @@ -28934,7 +27839,7 @@ class Lexer { */ exports.Lexer = Lexer; function isPunctuatorTokenKind(kind) { - return kind === _tokenKind.TokenKind.BANG || kind === _tokenKind.TokenKind.QUESTION_MARK || kind === _tokenKind.TokenKind.DOLLAR || kind === _tokenKind.TokenKind.AMP || kind === _tokenKind.TokenKind.PAREN_L || kind === _tokenKind.TokenKind.PAREN_R || kind === _tokenKind.TokenKind.SPREAD || kind === _tokenKind.TokenKind.COLON || kind === _tokenKind.TokenKind.EQUALS || kind === _tokenKind.TokenKind.AT || kind === _tokenKind.TokenKind.BRACKET_L || kind === _tokenKind.TokenKind.BRACKET_R || kind === _tokenKind.TokenKind.BRACE_L || kind === _tokenKind.TokenKind.PIPE || kind === _tokenKind.TokenKind.BRACE_R; + return kind === _tokenKind.TokenKind.BANG || kind === _tokenKind.TokenKind.DOLLAR || kind === _tokenKind.TokenKind.AMP || kind === _tokenKind.TokenKind.PAREN_L || kind === _tokenKind.TokenKind.PAREN_R || kind === _tokenKind.TokenKind.SPREAD || kind === _tokenKind.TokenKind.COLON || kind === _tokenKind.TokenKind.EQUALS || kind === _tokenKind.TokenKind.AT || kind === _tokenKind.TokenKind.BRACKET_L || kind === _tokenKind.TokenKind.BRACKET_R || kind === _tokenKind.TokenKind.BRACE_L || kind === _tokenKind.TokenKind.PIPE || kind === _tokenKind.TokenKind.BRACE_R; } /** * A Unicode scalar value is any Unicode code point except surrogate code @@ -28944,6 +27849,7 @@ function isPunctuatorTokenKind(kind) { * SourceCharacter :: * - "Any Unicode scalar value" */ + function isUnicodeScalarValue(code) { return code >= 0x0000 && code <= 0xd7ff || code >= 0xe000 && code <= 0x10ffff; } @@ -28955,6 +27861,7 @@ function isUnicodeScalarValue(code) { * encodes a supplementary code point (above U+FFFF), but unpaired surrogate * code points are not valid source characters. */ + function isSupplementaryCodePoint(body, location) { return isLeadingSurrogate(body.charCodeAt(location)) && isTrailingSurrogate(body.charCodeAt(location + 1)); } @@ -28971,6 +27878,7 @@ function isTrailingSurrogate(code) { * Printable ASCII is printed quoted, while other points are printed in Unicode * code point form (ie. U+1234). */ + function printCodePointAt(lexer, location) { const code = lexer.source.body.codePointAt(location); if (code === undefined) { @@ -28979,13 +27887,14 @@ function printCodePointAt(lexer, location) { // Printable ASCII const char = String.fromCodePoint(code); return char === '"' ? "'\"'" : `"${char}"`; - } - // Unicode code point + } // Unicode code point + return 'U+' + code.toString(16).toUpperCase().padStart(4, '0'); } /** * Create a token with line and column location information. */ + function createToken(lexer, kind, start, end, value) { const line = lexer.line; const col = 1 + start - lexer.lineStart; @@ -28998,13 +27907,14 @@ function createToken(lexer, kind, start, end, value) { * punctuators immediately or calls the appropriate helper function for more * complicated tokens. */ + function readNextToken(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; let position = start; while (position < bodyLength) { - const code = body.charCodeAt(position); - // SourceCharacter + const code = body.charCodeAt(position); // SourceCharacter + switch (code) { // Ignored :: // - UnicodeBOM @@ -29021,8 +27931,11 @@ function readNextToken(lexer, start) { // // Comma :: , case 0xfeff: // + case 0x0009: // \t + case 0x0020: // + case 0x002c: // , ++position; @@ -29031,6 +27944,7 @@ function readNextToken(lexer, start) { // - "New Line (U+000A)" // - "Carriage Return (U+000D)" [lookahead != "New Line (U+000A)"] // - "Carriage Return (U+000D)" "New Line (U+000A)" + case 0x000a: // \n ++position; @@ -29048,6 +27962,7 @@ function readNextToken(lexer, start) { lexer.lineStart = position; continue; // Comment + case 0x0023: // # return readComment(lexer, position); @@ -29059,6 +27974,7 @@ function readNextToken(lexer, start) { // - StringValue // // Punctuator :: one of ! $ & ( ) ... : = @ [ ] { | } + case 0x0021: // ! return createToken(lexer, _tokenKind.TokenKind.BANG, position, position + 1); @@ -29104,22 +28020,20 @@ function readNextToken(lexer, start) { case 0x007d: // } return createToken(lexer, _tokenKind.TokenKind.BRACE_R, position, position + 1); - case 0x003f: - // ? - return createToken(lexer, _tokenKind.TokenKind.QUESTION_MARK, position, position + 1); // StringValue + case 0x0022: // " if (body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022) { return readBlockString(lexer, position); } return readString(lexer, position); - } - // IntValue | FloatValue (Digit | -) + } // IntValue | FloatValue (Digit | -) + if ((0, _characterClasses.isDigit)(code) || code === 0x002d) { return readNumber(lexer, position, code); - } - // Name + } // Name + if ((0, _characterClasses.isNameStart)(code)) { return readName(lexer, position); } @@ -29136,17 +28050,18 @@ function readNextToken(lexer, start) { * CommentChar :: SourceCharacter but not LineTerminator * ``` */ + function readComment(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; let position = start + 1; while (position < bodyLength) { - const code = body.charCodeAt(position); - // LineTerminator (\n | \r) + const code = body.charCodeAt(position); // LineTerminator (\n | \r) + if (code === 0x000a || code === 0x000d) { break; - } - // SourceCharacter + } // SourceCharacter + if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { @@ -29186,16 +28101,17 @@ function readComment(lexer, start) { * Sign :: one of + - * ``` */ + function readNumber(lexer, start, firstCode) { const body = lexer.source.body; let position = start; let code = firstCode; - let isFloat = false; - // NegativeSign (-) + let isFloat = false; // NegativeSign (-) + if (code === 0x002d) { code = body.charCodeAt(++position); - } - // Zero (0) + } // Zero (0) + if (code === 0x0030) { code = body.charCodeAt(++position); if ((0, _characterClasses.isDigit)(code)) { @@ -29204,26 +28120,26 @@ function readNumber(lexer, start, firstCode) { } else { position = readDigits(lexer, position, code); code = body.charCodeAt(position); - } - // Full stop (.) + } // Full stop (.) + if (code === 0x002e) { isFloat = true; code = body.charCodeAt(++position); position = readDigits(lexer, position, code); code = body.charCodeAt(position); - } - // E e + } // E e + if (code === 0x0045 || code === 0x0065) { isFloat = true; - code = body.charCodeAt(++position); - // + - + code = body.charCodeAt(++position); // + - + if (code === 0x002b || code === 0x002d) { code = body.charCodeAt(++position); } position = readDigits(lexer, position, code); code = body.charCodeAt(position); - } - // Numbers cannot be followed by . or NameStart + } // Numbers cannot be followed by . or NameStart + if (code === 0x002e || (0, _characterClasses.isNameStart)(code)) { throw (0, _syntaxError.syntaxError)(lexer.source, position, `Invalid number, expected digit but got: ${printCodePointAt(lexer, position)}.`); } @@ -29232,12 +28148,14 @@ function readNumber(lexer, start, firstCode) { /** * Returns the new position in the source after reading one or more digits. */ + function readDigits(lexer, start, firstCode) { if (!(0, _characterClasses.isDigit)(firstCode)) { throw (0, _syntaxError.syntaxError)(lexer.source, start, `Invalid number, expected digit but got: ${printCodePointAt(lexer, start)}.`); } const body = lexer.source.body; let position = start + 1; // +1 to skip first firstCode + while ((0, _characterClasses.isDigit)(body.charCodeAt(position))) { ++position; } @@ -29263,6 +28181,7 @@ function readDigits(lexer, start, firstCode) { * EscapedCharacter :: one of `"` `\` `/` `b` `f` `n` `r` `t` * ``` */ + function readString(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; @@ -29270,13 +28189,13 @@ function readString(lexer, start) { let chunkStart = position; let value = ''; while (position < bodyLength) { - const code = body.charCodeAt(position); - // Closing Quote (") + const code = body.charCodeAt(position); // Closing Quote (") + if (code === 0x0022) { value += body.slice(chunkStart, position); return createToken(lexer, _tokenKind.TokenKind.STRING, start, position + 1, value); - } - // Escape Sequence (\) + } // Escape Sequence (\) + if (code === 0x005c) { value += body.slice(chunkStart, position); const escape = body.charCodeAt(position + 1) === 0x0075 // u @@ -29286,12 +28205,12 @@ function readString(lexer, start) { position += escape.size; chunkStart = position; continue; - } - // LineTerminator (\n | \r) + } // LineTerminator (\n | \r) + if (code === 0x000a || code === 0x000d) { break; - } - // SourceCharacter + } // SourceCharacter + if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { @@ -29301,15 +28220,16 @@ function readString(lexer, start) { } } throw (0, _syntaxError.syntaxError)(lexer.source, position, 'Unterminated string.'); -} +} // The string value and lexed size of an escape sequence. + function readEscapedUnicodeVariableWidth(lexer, position) { const body = lexer.source.body; let point = 0; - let size = 3; - // Cannot be larger than 12 chars (\u{00000000}). + let size = 3; // Cannot be larger than 12 chars (\u{00000000}). + while (size < 12) { - const code = body.charCodeAt(position + size++); - // Closing Brace (}) + const code = body.charCodeAt(position + size++); // Closing Brace (}) + if (code === 0x007d) { // Must be at least 5 chars (\u{0}) and encode a Unicode scalar value. if (size < 5 || !isUnicodeScalarValue(point)) { @@ -29319,8 +28239,8 @@ function readEscapedUnicodeVariableWidth(lexer, position) { value: String.fromCodePoint(point), size }; - } - // Append this hex digit to the code point. + } // Append this hex digit to the code point. + point = point << 4 | readHexDigit(code); if (point < 0) { break; @@ -29336,9 +28256,9 @@ function readEscapedUnicodeFixedWidth(lexer, position) { value: String.fromCodePoint(code), size: 6 }; - } - // GraphQL allows JSON-style surrogate pair escape sequences, but only when + } // GraphQL allows JSON-style surrogate pair escape sequences, but only when // a valid pair is formed. + if (isLeadingSurrogate(code)) { // \u if (body.charCodeAt(position + 6) === 0x005c && body.charCodeAt(position + 7) === 0x0075) { @@ -29366,6 +28286,7 @@ function readEscapedUnicodeFixedWidth(lexer, position) { * * Returns a negative number if any char was not a valid hexadecimal digit. */ + function read16BitHexCode(body, position) { // readHexDigit() returns -1 on error. ORing a negative value with any other // value always produces a negative value. @@ -29385,6 +28306,7 @@ function read16BitHexCode(body, position) { * - `A` `B` `C` `D` `E` `F` * - `a` `b` `c` `d` `e` `f` */ + function readHexDigit(code) { return code >= 0x0030 && code <= 0x0039 // 0-9 ? code - 0x0030 : code >= 0x0041 && code <= 0x0046 // A-F @@ -29403,6 +28325,7 @@ function readHexDigit(code) { * | `r` | U+000D | carriage return | * | `t` | U+0009 | horizontal tab | */ + function readEscapedCharacter(lexer, position) { const body = lexer.source.body; const code = body.charCodeAt(position + 1); @@ -29470,6 +28393,7 @@ function readEscapedCharacter(lexer, position) { * - `\"""` * ``` */ + function readBlockString(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; @@ -29479,8 +28403,8 @@ function readBlockString(lexer, start) { let currentLine = ''; const blockLines = []; while (position < bodyLength) { - const code = body.charCodeAt(position); - // Closing Triple-Quote (""") + const code = body.charCodeAt(position); // Closing Triple-Quote (""") + if (code === 0x0022 && body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022) { currentLine += body.slice(chunkStart, position); blockLines.push(currentLine); @@ -29490,15 +28414,16 @@ function readBlockString(lexer, start) { lexer.line += blockLines.length - 1; lexer.lineStart = lineStart; return token; - } - // Escaped Triple-Quote (\""") + } // Escaped Triple-Quote (\""") + if (code === 0x005c && body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022 && body.charCodeAt(position + 3) === 0x0022) { currentLine += body.slice(chunkStart, position); chunkStart = position + 1; // skip only slash + position += 4; continue; - } - // LineTerminator + } // LineTerminator + if (code === 0x000a || code === 0x000d) { currentLine += body.slice(chunkStart, position); blockLines.push(currentLine); @@ -29511,8 +28436,8 @@ function readBlockString(lexer, start) { chunkStart = position; lineStart = position; continue; - } - // SourceCharacter + } // SourceCharacter + if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { @@ -29531,6 +28456,7 @@ function readBlockString(lexer, start) { * - NameStart NameContinue* [lookahead != NameContinue] * ``` */ + function readName(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; @@ -29562,6 +28488,10 @@ Object.defineProperty(exports, "__esModule", ({ exports.getLocation = getLocation; var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); const LineRegExp = /\r\n|[\n\r]/g; +/** + * Represents a location in a Source. + */ + /** * Takes a Source and a UTF-8 character offset, and returns the corresponding * line and column as a SourceLocation. @@ -29608,6 +28538,10 @@ var _kinds = __webpack_require__(/*! ./kinds.mjs */ "../../../node_modules/graph var _lexer = __webpack_require__(/*! ./lexer.mjs */ "../../../node_modules/graphql/language/lexer.mjs"); var _source = __webpack_require__(/*! ./source.mjs */ "../../../node_modules/graphql/language/source.mjs"); var _tokenKind = __webpack_require__(/*! ./tokenKind.mjs */ "../../../node_modules/graphql/language/tokenKind.mjs"); +/** + * Configuration options to control parser behavior + */ + /** * Given a GraphQL source, parses it into a Document. * Throws GraphQLError if a syntax error is encountered. @@ -29626,6 +28560,7 @@ function parse(source, options) { * * Consider providing the results to the utility function: valueFromAST(). */ + function parseValue(source, options) { const parser = new Parser(source, options); parser.expectToken(_tokenKind.TokenKind.SOF); @@ -29637,6 +28572,7 @@ function parseValue(source, options) { * Similar to parseValue(), but raises a parse error if it encounters a * variable. The return type will be a constant value. */ + function parseConstValue(source, options) { const parser = new Parser(source, options); parser.expectToken(_tokenKind.TokenKind.SOF); @@ -29654,6 +28590,7 @@ function parseConstValue(source, options) { * * Consider providing the results to the utility function: typeFromAST(). */ + function parseType(source, options) { const parser = new Parser(source, options); parser.expectToken(_tokenKind.TokenKind.SOF); @@ -29672,6 +28609,7 @@ function parseType(source, options) { * * @internal */ + class Parser { constructor(source, options = {}) { const sourceObj = (0, _source.isSource)(source) ? source : new _source.Source(source); @@ -29682,17 +28620,19 @@ class Parser { /** * Converts a name lex token into a name parse node. */ + parseName() { const token = this.expectToken(_tokenKind.TokenKind.NAME); return this.node(token, { kind: _kinds.Kind.NAME, value: token.value }); - } - // Implements the parsing rules in the Document section. + } // Implements the parsing rules in the Document section. + /** * Document : Definition+ */ + parseDocument() { return this.node(this._lexer.token, { kind: _kinds.Kind.DOCUMENT, @@ -29722,11 +28662,12 @@ class Parser { * - EnumTypeDefinition * - InputObjectTypeDefinition */ + parseDefinition() { if (this.peek(_tokenKind.TokenKind.BRACE_L)) { return this.parseOperationDefinition(); - } - // Many definitions begin with a description and require a lookahead. + } // Many definitions begin with a description and require a lookahead. + const hasDescription = this.peekDescription(); const keywordToken = hasDescription ? this._lexer.lookahead() : this._lexer.token; if (keywordToken.kind === _tokenKind.TokenKind.NAME) { @@ -29763,13 +28704,14 @@ class Parser { } } throw this.unexpected(keywordToken); - } - // Implements the parsing rules in the Operations section. + } // Implements the parsing rules in the Operations section. + /** * OperationDefinition : * - SelectionSet * - OperationType Name? VariableDefinitions? Directives? SelectionSet */ + parseOperationDefinition() { const start = this._lexer.token; if (this.peek(_tokenKind.TokenKind.BRACE_L)) { @@ -29799,6 +28741,7 @@ class Parser { /** * OperationType : one of query mutation subscription */ + parseOperationType() { const operationToken = this.expectToken(_tokenKind.TokenKind.NAME); switch (operationToken.value) { @@ -29814,12 +28757,14 @@ class Parser { /** * VariableDefinitions : ( VariableDefinition+ ) */ + parseVariableDefinitions() { return this.optionalMany(_tokenKind.TokenKind.PAREN_L, this.parseVariableDefinition, _tokenKind.TokenKind.PAREN_R); } /** * VariableDefinition : Variable : Type DefaultValue? Directives[Const]? */ + parseVariableDefinition() { return this.node(this._lexer.token, { kind: _kinds.Kind.VARIABLE_DEFINITION, @@ -29832,6 +28777,7 @@ class Parser { /** * Variable : $ Name */ + parseVariable() { const start = this._lexer.token; this.expectToken(_tokenKind.TokenKind.DOLLAR); @@ -29845,6 +28791,7 @@ class Parser { * SelectionSet : { Selection+ } * ``` */ + parseSelectionSet() { return this.node(this._lexer.token, { kind: _kinds.Kind.SELECTION_SET, @@ -29857,6 +28804,7 @@ class Parser { * - FragmentSpread * - InlineFragment */ + parseSelection() { return this.peek(_tokenKind.TokenKind.SPREAD) ? this.parseFragment() : this.parseField(); } @@ -29865,6 +28813,7 @@ class Parser { * * Alias : Name : */ + parseField() { const start = this._lexer.token; const nameOrAlias = this.parseName(); @@ -29881,47 +28830,22 @@ class Parser { alias, name, arguments: this.parseArguments(false), - // Experimental support for Client Controlled Nullability changes - // the grammar of Field: - nullabilityAssertion: this.parseNullabilityAssertion(), directives: this.parseDirectives(false), selectionSet: this.peek(_tokenKind.TokenKind.BRACE_L) ? this.parseSelectionSet() : undefined }); } - // TODO: add grammar comment after it finalizes - parseNullabilityAssertion() { - // Note: Client Controlled Nullability is experimental and may be changed or - // removed in the future. - if (this._options.experimentalClientControlledNullability !== true) { - return undefined; - } - const start = this._lexer.token; - let nullabilityAssertion; - if (this.expectOptionalToken(_tokenKind.TokenKind.BRACKET_L)) { - const innerModifier = this.parseNullabilityAssertion(); - this.expectToken(_tokenKind.TokenKind.BRACKET_R); - nullabilityAssertion = this.node(start, { - kind: _kinds.Kind.LIST_NULLABILITY_OPERATOR, - nullabilityAssertion: innerModifier - }); - } - if (this.expectOptionalToken(_tokenKind.TokenKind.BANG)) { - nullabilityAssertion = this.node(start, { - kind: _kinds.Kind.NON_NULL_ASSERTION, - nullabilityAssertion - }); - } else if (this.expectOptionalToken(_tokenKind.TokenKind.QUESTION_MARK)) { - nullabilityAssertion = this.node(start, { - kind: _kinds.Kind.ERROR_BOUNDARY, - nullabilityAssertion - }); - } - return nullabilityAssertion; - } + /** + * Arguments[Const] : ( Argument[?Const]+ ) + */ + parseArguments(isConst) { const item = isConst ? this.parseConstArgument : this.parseArgument; return this.optionalMany(_tokenKind.TokenKind.PAREN_L, item, _tokenKind.TokenKind.PAREN_R); } + /** + * Argument[Const] : Name : Value[?Const] + */ + parseArgument(isConst = false) { const start = this._lexer.token; const name = this.parseName(); @@ -29934,8 +28858,8 @@ class Parser { } parseConstArgument() { return this.parseArgument(true); - } - // Implements the parsing rules in the Fragments section. + } // Implements the parsing rules in the Fragments section. + /** * Corresponds to both FragmentSpread and InlineFragment in the spec. * @@ -29943,6 +28867,7 @@ class Parser { * * InlineFragment : ... TypeCondition? Directives? SelectionSet */ + parseFragment() { const start = this._lexer.token; this.expectToken(_tokenKind.TokenKind.SPREAD); @@ -29967,12 +28892,13 @@ class Parser { * * TypeCondition : NamedType */ + parseFragmentDefinition() { const start = this._lexer.token; - this.expectKeyword('fragment'); - // Legacy support for defining variables within fragments changes + this.expectKeyword('fragment'); // Legacy support for defining variables within fragments changes // the grammar of FragmentDefinition: // - fragment FragmentName VariableDefinitions? on TypeCondition Directives? SelectionSet + if (this._options.allowLegacyFragmentVariables === true) { return this.node(start, { kind: _kinds.Kind.FRAGMENT_DEFINITION, @@ -29994,12 +28920,33 @@ class Parser { /** * FragmentName : Name but not `on` */ + parseFragmentName() { if (this._lexer.token.value === 'on') { throw this.unexpected(); } return this.parseName(); - } + } // Implements the parsing rules in the Values section. + + /** + * Value[Const] : + * - [~Const] Variable + * - IntValue + * - FloatValue + * - StringValue + * - BooleanValue + * - NullValue + * - EnumValue + * - ListValue[?Const] + * - ObjectValue[?Const] + * + * BooleanValue : one of `true` `false` + * + * NullValue : `null` + * + * EnumValue : Name but not `true`, `false` or `null` + */ + parseValueLiteral(isConst) { const token = this._lexer.token; switch (token.kind) { @@ -30072,6 +29019,12 @@ class Parser { block: token.kind === _tokenKind.TokenKind.BLOCK_STRING }); } + /** + * ListValue[Const] : + * - [ ] + * - [ Value[?Const]+ ] + */ + parseList(isConst) { const item = () => this.parseValueLiteral(isConst); return this.node(this._lexer.token, { @@ -30079,6 +29032,14 @@ class Parser { values: this.any(_tokenKind.TokenKind.BRACKET_L, item, _tokenKind.TokenKind.BRACKET_R) }); } + /** + * ``` + * ObjectValue[Const] : + * - { } + * - { ObjectField[?Const]+ } + * ``` + */ + parseObject(isConst) { const item = () => this.parseObjectField(isConst); return this.node(this._lexer.token, { @@ -30086,6 +29047,10 @@ class Parser { fields: this.any(_tokenKind.TokenKind.BRACE_L, item, _tokenKind.TokenKind.BRACE_R) }); } + /** + * ObjectField[Const] : Name : Value[?Const] + */ + parseObjectField(isConst) { const start = this._lexer.token; const name = this.parseName(); @@ -30095,7 +29060,12 @@ class Parser { name, value: this.parseValueLiteral(isConst) }); - } + } // Implements the parsing rules in the Directives section. + + /** + * Directives[Const] : Directive[?Const]+ + */ + parseDirectives(isConst) { const directives = []; while (this.peek(_tokenKind.TokenKind.AT)) { @@ -30106,6 +29076,12 @@ class Parser { parseConstDirectives() { return this.parseDirectives(true); } + /** + * ``` + * Directive[Const] : @ Name Arguments[?Const]? + * ``` + */ + parseDirective(isConst) { const start = this._lexer.token; this.expectToken(_tokenKind.TokenKind.AT); @@ -30114,14 +29090,15 @@ class Parser { name: this.parseName(), arguments: this.parseArguments(isConst) }); - } - // Implements the parsing rules in the Types section. + } // Implements the parsing rules in the Types section. + /** * Type : * - NamedType * - ListType * - NonNullType */ + parseTypeReference() { const start = this._lexer.token; let type; @@ -30146,19 +29123,21 @@ class Parser { /** * NamedType : Name */ + parseNamedType() { return this.node(this._lexer.token, { kind: _kinds.Kind.NAMED_TYPE, name: this.parseName() }); - } - // Implements the parsing rules in the Type Definition section. + } // Implements the parsing rules in the Type Definition section. + peekDescription() { return this.peek(_tokenKind.TokenKind.STRING) || this.peek(_tokenKind.TokenKind.BLOCK_STRING); } /** * Description : StringValue */ + parseDescription() { if (this.peekDescription()) { return this.parseStringLiteral(); @@ -30169,6 +29148,7 @@ class Parser { * SchemaDefinition : Description? schema Directives[Const]? { OperationTypeDefinition+ } * ``` */ + parseSchemaDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30185,6 +29165,7 @@ class Parser { /** * OperationTypeDefinition : OperationType : NamedType */ + parseOperationTypeDefinition() { const start = this._lexer.token; const operation = this.parseOperationType(); @@ -30199,6 +29180,7 @@ class Parser { /** * ScalarTypeDefinition : Description? scalar Name Directives[Const]? */ + parseScalarTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30217,6 +29199,7 @@ class Parser { * Description? * type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition? */ + parseObjectTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30239,6 +29222,7 @@ class Parser { * - implements `&`? NamedType * - ImplementsInterfaces & NamedType */ + parseImplementsInterfaces() { return this.expectOptionalKeyword('implements') ? this.delimitedMany(_tokenKind.TokenKind.AMP, this.parseNamedType) : []; } @@ -30247,6 +29231,7 @@ class Parser { * FieldsDefinition : { FieldDefinition+ } * ``` */ + parseFieldsDefinition() { return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseFieldDefinition, _tokenKind.TokenKind.BRACE_R); } @@ -30254,6 +29239,7 @@ class Parser { * FieldDefinition : * - Description? Name ArgumentsDefinition? : Type Directives[Const]? */ + parseFieldDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30274,6 +29260,7 @@ class Parser { /** * ArgumentsDefinition : ( InputValueDefinition+ ) */ + parseArgumentDefs() { return this.optionalMany(_tokenKind.TokenKind.PAREN_L, this.parseInputValueDef, _tokenKind.TokenKind.PAREN_R); } @@ -30281,6 +29268,7 @@ class Parser { * InputValueDefinition : * - Description? Name : Type DefaultValue? Directives[Const]? */ + parseInputValueDef() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30305,6 +29293,7 @@ class Parser { * InterfaceTypeDefinition : * - Description? interface Name Directives[Const]? FieldsDefinition? */ + parseInterfaceTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30326,6 +29315,7 @@ class Parser { * UnionTypeDefinition : * - Description? union Name Directives[Const]? UnionMemberTypes? */ + parseUnionTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30346,6 +29336,7 @@ class Parser { * - = `|`? NamedType * - UnionMemberTypes | NamedType */ + parseUnionMemberTypes() { return this.expectOptionalToken(_tokenKind.TokenKind.EQUALS) ? this.delimitedMany(_tokenKind.TokenKind.PIPE, this.parseNamedType) : []; } @@ -30353,6 +29344,7 @@ class Parser { * EnumTypeDefinition : * - Description? enum Name Directives[Const]? EnumValuesDefinition? */ + parseEnumTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30373,12 +29365,14 @@ class Parser { * EnumValuesDefinition : { EnumValueDefinition+ } * ``` */ + parseEnumValuesDefinition() { return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseEnumValueDefinition, _tokenKind.TokenKind.BRACE_R); } /** * EnumValueDefinition : Description? EnumValue Directives[Const]? */ + parseEnumValueDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30394,6 +29388,7 @@ class Parser { /** * EnumValue : Name but not `true`, `false` or `null` */ + parseEnumValueName() { if (this._lexer.token.value === 'true' || this._lexer.token.value === 'false' || this._lexer.token.value === 'null') { throw (0, _syntaxError.syntaxError)(this._lexer.source, this._lexer.token.start, `${getTokenDesc(this._lexer.token)} is reserved and cannot be used for an enum value.`); @@ -30404,6 +29399,7 @@ class Parser { * InputObjectTypeDefinition : * - Description? input Name Directives[Const]? InputFieldsDefinition? */ + parseInputObjectTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30424,6 +29420,7 @@ class Parser { * InputFieldsDefinition : { InputValueDefinition+ } * ``` */ + parseInputFieldsDefinition() { return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseInputValueDef, _tokenKind.TokenKind.BRACE_R); } @@ -30440,6 +29437,7 @@ class Parser { * - EnumTypeExtension * - InputObjectTypeDefinition */ + parseTypeSystemExtension() { const keywordToken = this._lexer.lookahead(); if (keywordToken.kind === _tokenKind.TokenKind.NAME) { @@ -30469,6 +29467,7 @@ class Parser { * - extend schema Directives[Const] * ``` */ + parseSchemaExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30488,6 +29487,7 @@ class Parser { * ScalarTypeExtension : * - extend scalar Name Directives[Const] */ + parseScalarTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30509,6 +29509,7 @@ class Parser { * - extend type Name ImplementsInterfaces? Directives[Const] * - extend type Name ImplementsInterfaces */ + parseObjectTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30534,6 +29535,7 @@ class Parser { * - extend interface Name ImplementsInterfaces? Directives[Const] * - extend interface Name ImplementsInterfaces */ + parseInterfaceTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30558,6 +29560,7 @@ class Parser { * - extend union Name Directives[Const]? UnionMemberTypes * - extend union Name Directives[Const] */ + parseUnionTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30580,6 +29583,7 @@ class Parser { * - extend enum Name Directives[Const]? EnumValuesDefinition * - extend enum Name Directives[Const] */ + parseEnumTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30602,6 +29606,7 @@ class Parser { * - extend input Name Directives[Const]? InputFieldsDefinition * - extend input Name Directives[Const] */ + parseInputObjectTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30625,6 +29630,7 @@ class Parser { * - Description? directive @ Name ArgumentsDefinition? `repeatable`? on DirectiveLocations * ``` */ + parseDirectiveDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30649,6 +29655,7 @@ class Parser { * - `|`? DirectiveLocation * - DirectiveLocations | DirectiveLocation */ + parseDirectiveLocations() { return this.delimitedMany(_tokenKind.TokenKind.PIPE, this.parseDirectiveLocation); } @@ -30679,20 +29686,22 @@ class Parser { * `INPUT_OBJECT` * `INPUT_FIELD_DEFINITION` */ + parseDirectiveLocation() { const start = this._lexer.token; const name = this.parseName(); - if (Object.hasOwn(_directiveLocation.DirectiveLocation, name.value)) { + if (Object.prototype.hasOwnProperty.call(_directiveLocation.DirectiveLocation, name.value)) { return name; } throw this.unexpected(start); - } - // Core parsing utility functions + } // Core parsing utility functions + /** * Returns a node that, if configured to do so, sets a "loc" field as a * location object, used to identify the place in the source that created a * given parsed object. */ + node(startToken, node) { if (this._options.noLocation !== true) { node.loc = new _ast.Location(startToken, this._lexer.lastToken, this._lexer.source); @@ -30702,6 +29711,7 @@ class Parser { /** * Determines if the next token is of a given kind */ + peek(kind) { return this._lexer.token.kind === kind; } @@ -30709,6 +29719,7 @@ class Parser { * If the next token is of the given kind, return that token after advancing the lexer. * Otherwise, do not change the parser state and throw an error. */ + expectToken(kind) { const token = this._lexer.token; if (token.kind === kind) { @@ -30721,6 +29732,7 @@ class Parser { * If the next token is of the given kind, return "true" after advancing the lexer. * Otherwise, do not change the parser state and return "false". */ + expectOptionalToken(kind) { const token = this._lexer.token; if (token.kind === kind) { @@ -30733,6 +29745,7 @@ class Parser { * If the next token is a given keyword, advance the lexer. * Otherwise, do not change the parser state and throw an error. */ + expectKeyword(value) { const token = this._lexer.token; if (token.kind === _tokenKind.TokenKind.NAME && token.value === value) { @@ -30745,6 +29758,7 @@ class Parser { * If the next token is a given keyword, return "true" after advancing the lexer. * Otherwise, do not change the parser state and return "false". */ + expectOptionalKeyword(value) { const token = this._lexer.token; if (token.kind === _tokenKind.TokenKind.NAME && token.value === value) { @@ -30756,6 +29770,7 @@ class Parser { /** * Helper function for creating an error when an unexpected lexed token is encountered. */ + unexpected(atToken) { const token = atToken !== null && atToken !== void 0 ? atToken : this._lexer.token; return (0, _syntaxError.syntaxError)(this._lexer.source, token.start, `Unexpected ${getTokenDesc(token)}.`); @@ -30765,6 +29780,7 @@ class Parser { * This list begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ + any(openKind, parseFn, closeKind) { this.expectToken(openKind); const nodes = []; @@ -30779,6 +29795,7 @@ class Parser { * that begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ + optionalMany(openKind, parseFn, closeKind) { if (this.expectOptionalToken(openKind)) { const nodes = []; @@ -30794,6 +29811,7 @@ class Parser { * This list begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ + many(openKind, parseFn, closeKind) { this.expectToken(openKind); const nodes = []; @@ -30807,6 +29825,7 @@ class Parser { * This list may begin with a lex token of delimiterKind followed by items separated by lex tokens of tokenKind. * Advances the parser to the next lex token after last item in the list. */ + delimitedMany(delimiterKind, parseFn) { this.expectOptionalToken(delimiterKind); const nodes = []; @@ -30823,7 +29842,7 @@ class Parser { if (maxTokens !== undefined && token.kind !== _tokenKind.TokenKind.EOF) { ++this._tokenCounter; if (this._tokenCounter > maxTokens) { - throw (0, _syntaxError.syntaxError)(this._lexer.source, token.start, `Document contains more than ${maxTokens} tokens. Parsing aborted.`); + throw (0, _syntaxError.syntaxError)(this._lexer.source, token.start, `Document contains more that ${maxTokens} tokens. Parsing aborted.`); } } } @@ -30839,6 +29858,7 @@ function getTokenDesc(token) { /** * A helper function to describe a token kind as a string for debugging. */ + function getTokenKindDesc(kind) { return (0, _lexer.isPunctuatorTokenKind)(kind) ? `"${kind}"` : kind; } @@ -30859,7 +29879,6 @@ Object.defineProperty(exports, "__esModule", ({ exports.isConstValueNode = isConstValueNode; exports.isDefinitionNode = isDefinitionNode; exports.isExecutableDefinitionNode = isExecutableDefinitionNode; -exports.isNullabilityAssertionNode = isNullabilityAssertionNode; exports.isSelectionNode = isSelectionNode; exports.isTypeDefinitionNode = isTypeDefinitionNode; exports.isTypeExtensionNode = isTypeExtensionNode; @@ -30877,9 +29896,6 @@ function isExecutableDefinitionNode(node) { function isSelectionNode(node) { return node.kind === _kinds.Kind.FIELD || node.kind === _kinds.Kind.FRAGMENT_SPREAD || node.kind === _kinds.Kind.INLINE_FRAGMENT; } -function isNullabilityAssertionNode(node) { - return node.kind === _kinds.Kind.LIST_NULLABILITY_OPERATOR || node.kind === _kinds.Kind.NON_NULL_ASSERTION || node.kind === _kinds.Kind.ERROR_BOUNDARY; -} function isValueNode(node) { return node.kind === _kinds.Kind.VARIABLE || node.kind === _kinds.Kind.INT || node.kind === _kinds.Kind.FLOAT || node.kind === _kinds.Kind.STRING || node.kind === _kinds.Kind.BOOLEAN || node.kind === _kinds.Kind.NULL || node.kind === _kinds.Kind.ENUM || node.kind === _kinds.Kind.LIST || node.kind === _kinds.Kind.OBJECT; } @@ -30927,6 +29943,7 @@ function printLocation(location) { /** * Render a helpful description of the location in the GraphQL Source document. */ + function printSourceLocation(source, sourceLocation) { const firstLineColumnOffset = source.locationOffset.column - 1; const body = ''.padStart(firstLineColumnOffset) + source.body; @@ -30937,8 +29954,8 @@ function printSourceLocation(source, sourceLocation) { const columnNum = sourceLocation.column + columnOffset; const locationStr = `${source.name}:${lineNum}:${columnNum}\n`; const lines = body.split(/\r\n|[\n\r]/g); - const locationLine = lines[lineIndex]; - // Special case for minified documents + const locationLine = lines[lineIndex]; // Special case for minified documents + if (locationLine.length > 120) { const subLineIndex = Math.floor(columnNum / 80); const subLineColumnNum = columnNum % 80; @@ -30978,14 +29995,24 @@ exports.printString = printString; */ function printString(str) { return `"${str.replace(escapedRegExp, escapedReplacer)}"`; -} -// eslint-disable-next-line no-control-regex +} // eslint-disable-next-line no-control-regex + const escapedRegExp = /[\x00-\x1f\x22\x5c\x7f-\x9f]/g; function escapedReplacer(str) { return escapeSequences[str.charCodeAt(0)]; -} -// prettier-ignore -const escapeSequences = ['\\u0000', '\\u0001', '\\u0002', '\\u0003', '\\u0004', '\\u0005', '\\u0006', '\\u0007', '\\b', '\\t', '\\n', '\\u000B', '\\f', '\\r', '\\u000E', '\\u000F', '\\u0010', '\\u0011', '\\u0012', '\\u0013', '\\u0014', '\\u0015', '\\u0016', '\\u0017', '\\u0018', '\\u0019', '\\u001A', '\\u001B', '\\u001C', '\\u001D', '\\u001E', '\\u001F', '', '', '\\"', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\\\', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\u007F', '\\u0080', '\\u0081', '\\u0082', '\\u0083', '\\u0084', '\\u0085', '\\u0086', '\\u0087', '\\u0088', '\\u0089', '\\u008A', '\\u008B', '\\u008C', '\\u008D', '\\u008E', '\\u008F', '\\u0090', '\\u0091', '\\u0092', '\\u0093', '\\u0094', '\\u0095', '\\u0096', '\\u0097', '\\u0098', '\\u0099', '\\u009A', '\\u009B', '\\u009C', '\\u009D', '\\u009E', '\\u009F']; +} // prettier-ignore + +const escapeSequences = ['\\u0000', '\\u0001', '\\u0002', '\\u0003', '\\u0004', '\\u0005', '\\u0006', '\\u0007', '\\b', '\\t', '\\n', '\\u000B', '\\f', '\\r', '\\u000E', '\\u000F', '\\u0010', '\\u0011', '\\u0012', '\\u0013', '\\u0014', '\\u0015', '\\u0016', '\\u0017', '\\u0018', '\\u0019', '\\u001A', '\\u001B', '\\u001C', '\\u001D', '\\u001E', '\\u001F', '', '', '\\"', '', '', '', '', '', '', '', '', '', '', '', '', '', +// 2F +'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', +// 3F +'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', +// 4F +'', '', '', '', '', '', '', '', '', '', '', '', '\\\\', '', '', '', +// 5F +'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', +// 6F +'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\u007F', '\\u0080', '\\u0081', '\\u0082', '\\u0083', '\\u0084', '\\u0085', '\\u0086', '\\u0087', '\\u0088', '\\u0089', '\\u008A', '\\u008B', '\\u008C', '\\u008D', '\\u008E', '\\u008F', '\\u0090', '\\u0091', '\\u0092', '\\u0093', '\\u0094', '\\u0095', '\\u0096', '\\u0097', '\\u0098', '\\u0099', '\\u009A', '\\u009B', '\\u009C', '\\u009D', '\\u009E', '\\u009F']; /***/ }), @@ -31008,6 +30035,7 @@ var _visitor = __webpack_require__(/*! ./visitor.mjs */ "../../../node_modules/g * Converts an AST into a string, using one set of reasonable * formatting rules. */ + function print(ast) { return (0, _visitor.visit)(ast, printDocASTReducer); } @@ -31026,9 +30054,9 @@ const printDocASTReducer = { OperationDefinition: { leave(node) { const varDefs = wrap('(', join(node.variableDefinitions, ', '), ')'); - const prefix = join([node.operation, join([node.name, varDefs]), join(node.directives, ' ')], ' '); - // Anonymous queries with no directives or variable definitions can use + const prefix = join([node.operation, join([node.name, varDefs]), join(node.directives, ' ')], ' '); // Anonymous queries with no directives or variable definitions can use // the query short form. + return (prefix === 'query' ? '' : prefix + ' ') + node.selectionSet; } }, @@ -31050,19 +30078,15 @@ const printDocASTReducer = { alias, name, arguments: args, - nullabilityAssertion, directives, selectionSet }) { - const prefix = join([wrap('', alias, ': '), name], ''); + const prefix = wrap('', alias, ': ') + name; let argsLine = prefix + wrap('(', join(args, ', '), ')'); if (argsLine.length > MAX_LINE_LENGTH) { argsLine = prefix + wrap('(\n', indent(join(args, '\n')), '\n)'); } - return join([argsLine, - // Note: Client Controlled Nullability is experimental and may be - // changed or removed in the future. - nullabilityAssertion, wrap(' ', join(directives, ' ')), wrap(' ', selectionSet)]); + return join([argsLine, join(directives, ' '), selectionSet], ' '); } }, Argument: { @@ -31071,28 +30095,6 @@ const printDocASTReducer = { value }) => name + ': ' + value }, - // Nullability Modifiers - ListNullabilityOperator: { - leave({ - nullabilityAssertion - }) { - return join(['[', nullabilityAssertion, ']']); - } - }, - NonNullAssertion: { - leave({ - nullabilityAssertion - }) { - return join([nullabilityAssertion, '!']); - } - }, - ErrorBoundary: { - leave({ - nullabilityAssertion - }) { - return join([nullabilityAssertion, '?']); - } - }, // Fragments FragmentSpread: { leave: ({ @@ -31114,8 +30116,8 @@ const printDocASTReducer = { variableDefinitions, directives, selectionSet - }) => - // Note: fragment variable definitions are experimental and may be changed + } // Note: fragment variable definitions are experimental and may be changed + ) => // or removed in the future. `fragment ${name}${wrap('(', join(variableDefinitions, ', '), ')')} ` + `on ${typeCondition} ${wrap('', join(directives, ' '), ' ')}` + selectionSet }, @@ -31134,7 +30136,7 @@ const printDocASTReducer = { leave: ({ value, block: isBlockString - }) => isBlockString === true ? (0, _blockString.printBlockString)(value) : (0, _printString.printString)(value) + }) => isBlockString ? (0, _blockString.printBlockString)(value) : (0, _printString.printString)(value) }, BooleanValue: { leave: ({ @@ -31152,21 +30154,12 @@ const printDocASTReducer = { ListValue: { leave: ({ values - }) => { - const valuesLine = '[' + join(values, ', ') + ']'; - if (valuesLine.length > MAX_LINE_LENGTH) { - return '[\n' + indent(join(values, '\n')) + '\n]'; - } - return valuesLine; - } + }) => '[' + join(values, ', ') + ']' }, ObjectValue: { leave: ({ fields - }) => { - const fieldsLine = '{ ' + join(fields, ', ') + ' }'; - return fieldsLine.length > MAX_LINE_LENGTH ? block(fields) : fieldsLine; - } + }) => '{' + join(fields, ', ') + '}' }, ObjectField: { leave: ({ @@ -31348,6 +30341,7 @@ const printDocASTReducer = { * Given maybeArray, print an empty string if it is null or empty, otherwise * print all items together separated by separator if provided */ + function join(maybeArray, separator = '') { var _maybeArray$filter$jo; return (_maybeArray$filter$jo = maybeArray === null || maybeArray === void 0 ? void 0 : maybeArray.filter(x => x).join(separator)) !== null && _maybeArray$filter$jo !== void 0 ? _maybeArray$filter$jo : ''; @@ -31355,21 +30349,25 @@ function join(maybeArray, separator = '') { /** * Given array, print each item on its own line, wrapped in an indented `{ }` block. */ + function block(array) { return wrap('{\n', indent(join(array, '\n')), '\n}'); } /** * If maybeString is not null or empty, then wrap with start and end, otherwise print an empty string. */ + function wrap(start, maybeString, end = '') { return maybeString != null && maybeString !== '' ? start + maybeString + end : ''; } function indent(str) { - return wrap(' ', str.replaceAll('\n', '\n ')); + return wrap(' ', str.replace(/\n/g, '\n ')); } function hasMultilineItems(maybeArray) { var _maybeArray$some; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ return (_maybeArray$some = maybeArray === null || maybeArray === void 0 ? void 0 : maybeArray.some(str => str.includes('\n'))) !== null && _maybeArray$some !== void 0 ? _maybeArray$some : false; } @@ -31390,6 +30388,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.Source = void 0; exports.isSource = isSource; var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); /** * A representation of source input to GraphQL. The `name` and `locationOffset` parameters are @@ -31403,6 +30402,7 @@ class Source { line: 1, column: 1 }) { + typeof body === 'string' || (0, _devAssert.devAssert)(false, `Body must be a string. Received: ${(0, _inspect.inspect)(body)}.`); this.body = body; this.name = name; this.locationOffset = locationOffset; @@ -31446,7 +30446,6 @@ var TokenKind; TokenKind['SOF'] = ''; TokenKind['EOF'] = ''; TokenKind['BANG'] = '!'; - TokenKind['QUESTION_MARK'] = '?'; TokenKind['DOLLAR'] = '$'; TokenKind['AMP'] = '&'; TokenKind['PAREN_L'] = '('; @@ -31468,6 +30467,12 @@ var TokenKind; TokenKind['COMMENT'] = 'Comment'; })(TokenKind || (exports.TokenKind = TokenKind = {})); +/** + * The enum type representing the token kinds values. + * + * @deprecated Please use `TokenKind`. Will be remove in v17. + */ + /***/ }), /***/ "../../../node_modules/graphql/language/visitor.mjs": @@ -31483,19 +30488,105 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.BREAK = void 0; exports.getEnterLeaveForKind = getEnterLeaveForKind; +exports.getVisitFn = getVisitFn; exports.visit = visit; exports.visitInParallel = visitInParallel; var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _ast = __webpack_require__(/*! ./ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _kinds = __webpack_require__(/*! ./kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); +/** + * A visitor is provided to visit, it contains the collection of + * relevant functions to be called during the visitor's traversal. + */ + const BREAK = exports.BREAK = Object.freeze({}); +/** + * visit() will walk through an AST using a depth-first traversal, calling + * the visitor's enter function at each node in the traversal, and calling the + * leave function after visiting that node and all of its child nodes. + * + * By returning different values from the enter and leave functions, the + * behavior of the visitor can be altered, including skipping over a sub-tree of + * the AST (by returning false), editing the AST by returning a value or null + * to remove the value, or to stop the whole traversal by returning BREAK. + * + * When using visit() to edit an AST, the original AST will not be modified, and + * a new version of the AST with the changes applied will be returned from the + * visit function. + * + * ```ts + * const editedAST = visit(ast, { + * enter(node, key, parent, path, ancestors) { + * // @return + * // undefined: no action + * // false: skip visiting this node + * // visitor.BREAK: stop visiting altogether + * // null: delete this node + * // any value: replace this node with the returned value + * }, + * leave(node, key, parent, path, ancestors) { + * // @return + * // undefined: no action + * // false: no action + * // visitor.BREAK: stop visiting altogether + * // null: delete this node + * // any value: replace this node with the returned value + * } + * }); + * ``` + * + * Alternatively to providing enter() and leave() functions, a visitor can + * instead provide functions named the same as the kinds of AST nodes, or + * enter/leave visitors at a named key, leading to three permutations of the + * visitor API: + * + * 1) Named visitors triggered when entering a node of a specific kind. + * + * ```ts + * visit(ast, { + * Kind(node) { + * // enter the "Kind" node + * } + * }) + * ``` + * + * 2) Named visitors that trigger upon entering and leaving a node of a specific kind. + * + * ```ts + * visit(ast, { + * Kind: { + * enter(node) { + * // enter the "Kind" node + * } + * leave(node) { + * // leave the "Kind" node + * } + * } + * }) + * ``` + * + * 3) Generic visitors that trigger upon entering and leaving any node. + * + * ```ts + * visit(ast, { + * enter(node) { + * // enter any node + * }, + * leave(node) { + * // leave any node + * } + * }) + * ``` + */ + function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { const enterLeaveMap = new Map(); for (const kind of Object.values(_kinds.Kind)) { enterLeaveMap.set(kind, getEnterLeaveForKind(visitor, kind)); } /* eslint-disable no-undef-init */ + let stack = undefined; let inArray = Array.isArray(root); let keys = [root]; @@ -31507,6 +30598,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { const path = []; const ancestors = []; /* eslint-enable no-undef-init */ + do { index++; const isLeaving = index === keys.length; @@ -31540,7 +30632,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { edits = stack.edits; inArray = stack.inArray; stack = stack.prev; - } else if (parent != null) { + } else if (parent) { key = inArray ? index : keys[index]; node = parent[key]; if (node === null || node === undefined) { @@ -31580,7 +30672,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { if (isLeaving) { path.pop(); } else { - var _visitorKeys$node$kin; + var _node$kind; stack = { inArray, index, @@ -31589,10 +30681,10 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { prev: stack }; inArray = Array.isArray(node); - keys = inArray ? node : (_visitorKeys$node$kin = visitorKeys[node.kind]) !== null && _visitorKeys$node$kin !== void 0 ? _visitorKeys$node$kin : []; + keys = inArray ? node : (_node$kind = visitorKeys[node.kind]) !== null && _node$kind !== void 0 ? _node$kind : []; index = -1; edits = []; - if (parent != null) { + if (parent) { ancestors.push(parent); } parent = node; @@ -31600,7 +30692,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { } while (stack !== undefined); if (edits.length !== 0) { // New root - return edits.at(-1)[1]; + return edits[edits.length - 1][1]; } return root; } @@ -31610,6 +30702,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { * * If a prior visitor edits a node, no following visitors will see that node. */ + function visitInParallel(visitors) { const skipping = new Array(visitors.length).fill(null); const mergedVisitor = Object.create(null); @@ -31622,7 +30715,7 @@ function visitInParallel(visitors) { enter, leave } = getEnterLeaveForKind(visitors[i], kind); - hasVisitor ||= enter != null || leave != null; + hasVisitor || (hasVisitor = enter != null || leave != null); enterList[i] = enter; leaveList[i] = leave; } @@ -31670,6 +30763,7 @@ function visitInParallel(visitors) { /** * Given a visitor instance and a node kind, return EnterLeaveVisitor for that kind. */ + function getEnterLeaveForKind(visitor, kind) { const kindVisitor = visitor[kind]; if (typeof kindVisitor === 'object') { @@ -31681,13 +30775,29 @@ function getEnterLeaveForKind(visitor, kind) { enter: kindVisitor, leave: undefined }; - } - // { enter() {}, leave() {} } + } // { enter() {}, leave() {} } + return { enter: visitor.enter, leave: visitor.leave }; } +/** + * Given a visitor instance, if it is leaving or not, and a node kind, return + * the function the visitor runtime should call. + * + * @deprecated Please use `getEnterLeaveForKind` instead. Will be removed in v17 + */ + +/* c8 ignore next 8 */ + +function getVisitFn(visitor, kind, isLeaving) { + const { + enter, + leave + } = getEnterLeaveForKind(visitor, kind); + return isLeaving ? leave : enter; +} /***/ }), @@ -31704,12 +30814,16 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.assertEnumValueName = assertEnumValueName; exports.assertName = assertName; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _characterClasses = __webpack_require__(/*! ../language/characterClasses.mjs */ "../../../node_modules/graphql/language/characterClasses.mjs"); /** * Upholds the spec rules about naming. */ + function assertName(name) { + name != null || (0, _devAssert.devAssert)(false, 'Must provide name.'); + typeof name === 'string' || (0, _devAssert.devAssert)(false, 'Expected name to be a string.'); if (name.length === 0) { throw new _GraphQLError.GraphQLError('Expected name to be a non-empty string.'); } @@ -31728,6 +30842,7 @@ function assertName(name) { * * @internal */ + function assertEnumValueName(name) { if (name === 'true' || name === 'false' || name === 'null') { throw new _GraphQLError.GraphQLError(`Enum values cannot be named: ${name}`); @@ -31796,6 +30911,7 @@ var _didYouMean = __webpack_require__(/*! ../jsutils/didYouMean.mjs */ "../../.. var _identityFunc = __webpack_require__(/*! ../jsutils/identityFunc.mjs */ "../../../node_modules/graphql/jsutils/identityFunc.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); +var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _keyValMap = __webpack_require__(/*! ../jsutils/keyValMap.mjs */ "../../../node_modules/graphql/jsutils/keyValMap.mjs"); var _mapValue = __webpack_require__(/*! ../jsutils/mapValue.mjs */ "../../../node_modules/graphql/jsutils/mapValue.mjs"); @@ -31818,6 +30934,7 @@ function assertType(type) { /** * There are predicates for each kind of GraphQL type. */ + function isScalarType(type) { return (0, _instanceOf.instanceOf)(type, GraphQLScalarType); } @@ -31890,6 +31007,10 @@ function assertNonNullType(type) { } return type; } +/** + * These types may be used as input types for arguments and directives. + */ + function isInputType(type) { return isScalarType(type) || isEnumType(type) || isInputObjectType(type) || isWrappingType(type) && isInputType(type.ofType); } @@ -31899,6 +31020,10 @@ function assertInputType(type) { } return type; } +/** + * These types may be used as output types as the result of fields. + */ + function isOutputType(type) { return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isWrappingType(type) && isOutputType(type.ofType); } @@ -31908,6 +31033,10 @@ function assertOutputType(type) { } return type; } +/** + * These types may describe types which may be leaf values. + */ + function isLeafType(type) { return isScalarType(type) || isEnumType(type); } @@ -31917,6 +31046,10 @@ function assertLeafType(type) { } return type; } +/** + * These types may describe the parent context of a selection set. + */ + function isCompositeType(type) { return isObjectType(type) || isInterfaceType(type) || isUnionType(type); } @@ -31926,6 +31059,10 @@ function assertCompositeType(type) { } return type; } +/** + * These types may describe the parent context of a selection set. + */ + function isAbstractType(type) { return isInterfaceType(type) || isUnionType(type); } @@ -31954,8 +31091,10 @@ function assertAbstractType(type) { * }) * ``` */ + class GraphQLList { constructor(ofType) { + isType(ofType) || (0, _devAssert.devAssert)(false, `Expected ${(0, _inspect.inspect)(ofType)} to be a GraphQL type.`); this.ofType = ofType; } get [Symbol.toStringTag]() { @@ -31992,6 +31131,7 @@ class GraphQLList { exports.GraphQLList = GraphQLList; class GraphQLNonNull { constructor(ofType) { + isNullableType(ofType) || (0, _devAssert.devAssert)(false, `Expected ${(0, _inspect.inspect)(ofType)} to be a GraphQL nullable type.`); this.ofType = ofType; } get [Symbol.toStringTag]() { @@ -32004,6 +31144,9 @@ class GraphQLNonNull { return this.toString(); } } +/** + * These types wrap and modify other types + */ exports.GraphQLNonNull = GraphQLNonNull; function isWrappingType(type) { return isListType(type) || isNonNullType(type); @@ -32014,6 +31157,10 @@ function assertWrappingType(type) { } return type; } +/** + * These types can all accept null as a value. + */ + function isNullableType(type) { return isType(type) && !isNonNullType(type); } @@ -32028,6 +31175,10 @@ function getNullableType(type) { return isNonNullType(type) ? type.ofType : type; } } +/** + * These named types do not include modifiers like List or NonNull. + */ + function isNamedType(type) { return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isInputObjectType(type); } @@ -32046,12 +31197,27 @@ function getNamedType(type) { return unwrappedType; } } +/** + * Used while defining GraphQL types to allow for circular references in + * otherwise immutable type definitions. + */ + function resolveReadonlyArrayThunk(thunk) { return typeof thunk === 'function' ? thunk() : thunk; } function resolveObjMapThunk(thunk) { return typeof thunk === 'function' ? thunk() : thunk; } +/** + * Custom extensions + * + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ + /** * Scalar Type Definition * @@ -32096,6 +31262,8 @@ class GraphQLScalarType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN = config.extensionASTNodes) !== null && _config$extensionASTN !== void 0 ? _config$extensionASTN : []; + config.specifiedByURL == null || typeof config.specifiedByURL === 'string' || (0, _devAssert.devAssert)(false, `${this.name} must provide "specifiedByURL" as a string, ` + `but got: ${(0, _inspect.inspect)(config.specifiedByURL)}.`); + config.serialize == null || typeof config.serialize === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "serialize" function. If this custom Scalar is also used as an input type, ensure "parseValue" and "parseLiteral" functions are also provided.`); if (config.parseLiteral) { typeof config.parseValue === 'function' && typeof config.parseLiteral === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide both "parseValue" and "parseLiteral" functions.`); } @@ -32123,6 +31291,7 @@ class GraphQLScalarType { return this.toString(); } } + /** * Object Type Definition * @@ -32173,10 +31342,9 @@ class GraphQLObjectType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN2 = config.extensionASTNodes) !== null && _config$extensionASTN2 !== void 0 ? _config$extensionASTN2 : []; - // prettier-ignore - // FIXME: blocked by https://github.com/prettier/prettier/issues/14625 - this._fields = defineFieldMap.bind(undefined, config.fields); - this._interfaces = defineInterfaces.bind(undefined, config.interfaces); + this._fields = () => defineFieldMap(config); + this._interfaces = () => defineInterfaces(config); + config.isTypeOf == null || typeof config.isTypeOf === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "isTypeOf" as a function, ` + `but got: ${(0, _inspect.inspect)(config.isTypeOf)}.`); } get [Symbol.toStringTag]() { return 'GraphQLObjectType'; @@ -32213,14 +31381,21 @@ class GraphQLObjectType { } } exports.GraphQLObjectType = GraphQLObjectType; -function defineInterfaces(interfaces) { - return resolveReadonlyArrayThunk(interfaces !== null && interfaces !== void 0 ? interfaces : []); +function defineInterfaces(config) { + var _config$interfaces; + const interfaces = resolveReadonlyArrayThunk((_config$interfaces = config.interfaces) !== null && _config$interfaces !== void 0 ? _config$interfaces : []); + Array.isArray(interfaces) || (0, _devAssert.devAssert)(false, `${config.name} interfaces must be an Array or a function which returns an Array.`); + return interfaces; } -function defineFieldMap(fields) { - const fieldMap = resolveObjMapThunk(fields); +function defineFieldMap(config) { + const fieldMap = resolveObjMapThunk(config.fields); + isPlainObj(fieldMap) || (0, _devAssert.devAssert)(false, `${config.name} fields must be an object with field names as keys or a function which returns such an object.`); return (0, _mapValue.mapValue)(fieldMap, (fieldConfig, fieldName) => { var _fieldConfig$args; + isPlainObj(fieldConfig) || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} field config must be an object.`); + fieldConfig.resolve == null || typeof fieldConfig.resolve === 'function' || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} field resolver must be a function if ` + `provided, but got: ${(0, _inspect.inspect)(fieldConfig.resolve)}.`); const argsConfig = (_fieldConfig$args = fieldConfig.args) !== null && _fieldConfig$args !== void 0 ? _fieldConfig$args : {}; + isPlainObj(argsConfig) || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} args must be an object with argument names as keys.`); return { name: (0, _assertName.assertName)(fieldName), description: fieldConfig.description, @@ -32234,8 +31409,8 @@ function defineFieldMap(fields) { }; }); } -function defineArguments(args) { - return Object.entries(args).map(([argName, argConfig]) => ({ +function defineArguments(config) { + return Object.entries(config).map(([argName, argConfig]) => ({ name: (0, _assertName.assertName)(argName), description: argConfig.description, type: argConfig.type, @@ -32245,6 +31420,9 @@ function defineArguments(args) { astNode: argConfig.astNode })); } +function isPlainObj(obj) { + return (0, _isObjectLike.isObjectLike)(obj) && !Array.isArray(obj); +} function fieldsToFieldsConfig(fields) { return (0, _mapValue.mapValue)(fields, field => ({ description: field.description, @@ -32260,6 +31438,7 @@ function fieldsToFieldsConfig(fields) { /** * @internal */ + function argsToArgsConfig(args) { return (0, _keyValMap.keyValMap)(args, arg => arg.name, arg => ({ description: arg.description, @@ -32273,6 +31452,7 @@ function argsToArgsConfig(args) { function isRequiredArgument(arg) { return isNonNullType(arg.type) && arg.defaultValue === undefined; } + /** * Interface Type Definition * @@ -32301,10 +31481,9 @@ class GraphQLInterfaceType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN3 = config.extensionASTNodes) !== null && _config$extensionASTN3 !== void 0 ? _config$extensionASTN3 : []; - // prettier-ignore - // FIXME: blocked by https://github.com/prettier/prettier/issues/14625 - this._fields = defineFieldMap.bind(undefined, config.fields); - this._interfaces = defineInterfaces.bind(undefined, config.interfaces); + this._fields = defineFieldMap.bind(undefined, config); + this._interfaces = defineInterfaces.bind(undefined, config); + config.resolveType == null || typeof config.resolveType === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "resolveType" as a function, ` + `but got: ${(0, _inspect.inspect)(config.resolveType)}.`); } get [Symbol.toStringTag]() { return 'GraphQLInterfaceType'; @@ -32340,6 +31519,7 @@ class GraphQLInterfaceType { return this.toString(); } } + /** * Union Type Definition * @@ -32374,7 +31554,8 @@ class GraphQLUnionType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN4 = config.extensionASTNodes) !== null && _config$extensionASTN4 !== void 0 ? _config$extensionASTN4 : []; - this._types = defineTypes.bind(undefined, config.types); + this._types = defineTypes.bind(undefined, config); + config.resolveType == null || typeof config.resolveType === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "resolveType" as a function, ` + `but got: ${(0, _inspect.inspect)(config.resolveType)}.`); } get [Symbol.toStringTag]() { return 'GraphQLUnionType'; @@ -32404,19 +31585,12 @@ class GraphQLUnionType { } } exports.GraphQLUnionType = GraphQLUnionType; -function defineTypes(types) { - return resolveReadonlyArrayThunk(types); -} -function enumValuesFromConfig(values) { - return Object.entries(values).map(([valueName, valueConfig]) => ({ - name: (0, _assertName.assertEnumValueName)(valueName), - description: valueConfig.description, - value: valueConfig.value !== undefined ? valueConfig.value : valueName, - deprecationReason: valueConfig.deprecationReason, - extensions: (0, _toObjMap.toObjMap)(valueConfig.extensions), - astNode: valueConfig.astNode - })); +function defineTypes(config) { + const types = resolveReadonlyArrayThunk(config.types); + Array.isArray(types) || (0, _devAssert.devAssert)(false, `Must provide Array of types or a function which returns such an array for Union ${config.name}.`); + return types; } + /** * Enum Type Definition * @@ -32440,7 +31614,8 @@ function enumValuesFromConfig(values) { * Note: If a value is not provided in a definition, the name of the enum value * will be used as its internal value. */ -class GraphQLEnumType /* */ { +class GraphQLEnumType { + /* */ constructor(config) { var _config$extensionASTN5; this.name = (0, _assertName.assertName)(config.name); @@ -32448,7 +31623,7 @@ class GraphQLEnumType /* */ { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN5 = config.extensionASTNodes) !== null && _config$extensionASTN5 !== void 0 ? _config$extensionASTN5 : []; - this._values = typeof config.values === 'function' ? config.values : enumValuesFromConfig(config.values); + this._values = typeof config.values === 'function' ? config.values : defineEnumValues(this.name, config.values); this._valueLookup = null; this._nameLookup = null; } @@ -32457,7 +31632,7 @@ class GraphQLEnumType /* */ { } getValues() { if (typeof this._values === 'function') { - this._values = enumValuesFromConfig(this._values()); + this._values = defineEnumValues(this.name, this._values()); } return this._values; } @@ -32467,7 +31642,7 @@ class GraphQLEnumType /* */ { } return this._nameLookup[name]; } - serialize(outputValue /* T */) { + serialize(outputValue) { if (this._valueLookup === null) { this._valueLookup = new Map(this.getValues().map(enumValue => [enumValue.value, enumValue])); } @@ -32477,7 +31652,8 @@ class GraphQLEnumType /* */ { } return enumValue.name; } - parseValue(inputValue) { + parseValue(inputValue) /* T */ + { if (typeof inputValue !== 'string') { const valueStr = (0, _inspect.inspect)(inputValue); throw new _GraphQLError.GraphQLError(`Enum "${this.name}" cannot represent non-string value: ${valueStr}.` + didYouMeanEnumValue(this, valueStr)); @@ -32488,7 +31664,8 @@ class GraphQLEnumType /* */ { } return enumValue.value; } - parseLiteral(valueNode, _variables) { + parseLiteral(valueNode, _variables) /* T */ + { // Note: variables will be resolved to a value before calling this function. if (valueNode.kind !== _kinds.Kind.ENUM) { const valueStr = (0, _printer.print)(valueNode); @@ -32535,6 +31712,21 @@ function didYouMeanEnumValue(enumType, unknownValueStr) { const suggestedValues = (0, _suggestionList.suggestionList)(unknownValueStr, allNames); return (0, _didYouMean.didYouMean)('the enum value', suggestedValues); } +function defineEnumValues(typeName, valueMap) { + isPlainObj(valueMap) || (0, _devAssert.devAssert)(false, `${typeName} values must be an object with value names as keys.`); + return Object.entries(valueMap).map(([valueName, valueConfig]) => { + isPlainObj(valueConfig) || (0, _devAssert.devAssert)(false, `${typeName}.${valueName} must refer to an object with a "value" key ` + `representing an internal value but got: ${(0, _inspect.inspect)(valueConfig)}.`); + return { + name: (0, _assertName.assertEnumValueName)(valueName), + description: valueConfig.description, + value: valueConfig.value !== undefined ? valueConfig.value : valueName, + deprecationReason: valueConfig.deprecationReason, + extensions: (0, _toObjMap.toObjMap)(valueConfig.extensions), + astNode: valueConfig.astNode + }; + }); +} + /** * Input Object Type Definition * @@ -32565,7 +31757,7 @@ class GraphQLInputObjectType { this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN6 = config.extensionASTNodes) !== null && _config$extensionASTN6 !== void 0 ? _config$extensionASTN6 : []; this.isOneOf = (_config$isOneOf = config.isOneOf) !== null && _config$isOneOf !== void 0 ? _config$isOneOf : false; - this._fields = defineInputFieldMap.bind(undefined, config.fields); + this._fields = defineInputFieldMap.bind(undefined, config); } get [Symbol.toStringTag]() { return 'GraphQLInputObjectType'; @@ -32603,17 +31795,21 @@ class GraphQLInputObjectType { } } exports.GraphQLInputObjectType = GraphQLInputObjectType; -function defineInputFieldMap(fields) { - const fieldMap = resolveObjMapThunk(fields); - return (0, _mapValue.mapValue)(fieldMap, (fieldConfig, fieldName) => ({ - name: (0, _assertName.assertName)(fieldName), - description: fieldConfig.description, - type: fieldConfig.type, - defaultValue: fieldConfig.defaultValue, - deprecationReason: fieldConfig.deprecationReason, - extensions: (0, _toObjMap.toObjMap)(fieldConfig.extensions), - astNode: fieldConfig.astNode - })); +function defineInputFieldMap(config) { + const fieldMap = resolveObjMapThunk(config.fields); + isPlainObj(fieldMap) || (0, _devAssert.devAssert)(false, `${config.name} fields must be an object with field names as keys or a function which returns such an object.`); + return (0, _mapValue.mapValue)(fieldMap, (fieldConfig, fieldName) => { + !('resolve' in fieldConfig) || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} field has a resolve property, but Input Types cannot define resolvers.`); + return { + name: (0, _assertName.assertName)(fieldName), + description: fieldConfig.description, + type: fieldConfig.type, + defaultValue: fieldConfig.defaultValue, + deprecationReason: fieldConfig.deprecationReason, + extensions: (0, _toObjMap.toObjMap)(fieldConfig.extensions), + astNode: fieldConfig.astNode + }; + }); } function isRequiredInputField(field) { return isNonNullType(field.type) && field.defaultValue === undefined; @@ -32632,13 +31828,15 @@ function isRequiredInputField(field) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.GraphQLStreamDirective = exports.GraphQLSpecifiedByDirective = exports.GraphQLSkipDirective = exports.GraphQLOneOfDirective = exports.GraphQLIncludeDirective = exports.GraphQLDirective = exports.GraphQLDeprecatedDirective = exports.GraphQLDeferDirective = exports.DEFAULT_DEPRECATION_REASON = void 0; +exports.GraphQLSpecifiedByDirective = exports.GraphQLSkipDirective = exports.GraphQLOneOfDirective = exports.GraphQLIncludeDirective = exports.GraphQLDirective = exports.GraphQLDeprecatedDirective = exports.DEFAULT_DEPRECATION_REASON = void 0; exports.assertDirective = assertDirective; exports.isDirective = isDirective; exports.isSpecifiedDirective = isSpecifiedDirective; exports.specifiedDirectives = void 0; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); +var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _toObjMap = __webpack_require__(/*! ../jsutils/toObjMap.mjs */ "../../../node_modules/graphql/jsutils/toObjMap.mjs"); var _directiveLocation = __webpack_require__(/*! ../language/directiveLocation.mjs */ "../../../node_modules/graphql/language/directiveLocation.mjs"); var _assertName = __webpack_require__(/*! ./assertName.mjs */ "../../../node_modules/graphql/type/assertName.mjs"); @@ -32647,6 +31845,7 @@ var _scalars = __webpack_require__(/*! ./scalars.mjs */ "../../../node_modules/g /** * Test if the given value is a GraphQL directive. */ + function isDirective(directive) { return (0, _instanceOf.instanceOf)(directive, GraphQLDirective); } @@ -32656,6 +31855,16 @@ function assertDirective(directive) { } return directive; } +/** + * Custom extensions + * + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ + /** * Directives are used by the GraphQL runtime as a way of modifying execution * behavior. Type system creators will usually not create these directly. @@ -32669,7 +31878,9 @@ class GraphQLDirective { this.isRepeatable = (_config$isRepeatable = config.isRepeatable) !== null && _config$isRepeatable !== void 0 ? _config$isRepeatable : false; this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; + Array.isArray(config.locations) || (0, _devAssert.devAssert)(false, `@${config.name} locations must be an Array.`); const args = (_config$args = config.args) !== null && _config$args !== void 0 ? _config$args : {}; + (0, _isObjectLike.isObjectLike)(args) && !Array.isArray(args) || (0, _devAssert.devAssert)(false, `@${config.name} args must be an object with argument names as keys.`); this.args = (0, _definition.defineArguments)(args); } get [Symbol.toStringTag]() { @@ -32693,6 +31904,7 @@ class GraphQLDirective { return this.toString(); } } + /** * Used to conditionally include fields or fragments. */ @@ -32711,6 +31923,7 @@ const GraphQLIncludeDirective = exports.GraphQLIncludeDirective = new GraphQLDir /** * Used to conditionally skip (exclude) fields or fragments. */ + const GraphQLSkipDirective = exports.GraphQLSkipDirective = new GraphQLDirective({ name: 'skip', description: 'Directs the executor to skip this field or fragment when the `if` argument is true.', @@ -32722,56 +31935,15 @@ const GraphQLSkipDirective = exports.GraphQLSkipDirective = new GraphQLDirective } } }); -/** - * Used to conditionally defer fragments. - */ -const GraphQLDeferDirective = exports.GraphQLDeferDirective = new GraphQLDirective({ - name: 'defer', - description: 'Directs the executor to defer this fragment when the `if` argument is true or undefined.', - locations: [_directiveLocation.DirectiveLocation.FRAGMENT_SPREAD, _directiveLocation.DirectiveLocation.INLINE_FRAGMENT], - args: { - if: { - type: new _definition.GraphQLNonNull(_scalars.GraphQLBoolean), - description: 'Deferred when true or undefined.', - defaultValue: true - }, - label: { - type: _scalars.GraphQLString, - description: 'Unique name' - } - } -}); -/** - * Used to conditionally stream list fields. - */ -const GraphQLStreamDirective = exports.GraphQLStreamDirective = new GraphQLDirective({ - name: 'stream', - description: 'Directs the executor to stream plural fields when the `if` argument is true or undefined.', - locations: [_directiveLocation.DirectiveLocation.FIELD], - args: { - if: { - type: new _definition.GraphQLNonNull(_scalars.GraphQLBoolean), - description: 'Stream when true or undefined.', - defaultValue: true - }, - label: { - type: _scalars.GraphQLString, - description: 'Unique name' - }, - initialCount: { - defaultValue: 0, - type: _scalars.GraphQLInt, - description: 'Number of items to return immediately' - } - } -}); /** * Constant string used for default reason for a deprecation. */ + const DEFAULT_DEPRECATION_REASON = exports.DEFAULT_DEPRECATION_REASON = 'No longer supported'; /** * Used to declare element of a GraphQL schema as deprecated. */ + const GraphQLDeprecatedDirective = exports.GraphQLDeprecatedDirective = new GraphQLDirective({ name: 'deprecated', description: 'Marks an element of a GraphQL schema as no longer supported.', @@ -32787,6 +31959,7 @@ const GraphQLDeprecatedDirective = exports.GraphQLDeprecatedDirective = new Grap /** * Used to provide a URL for specifying the behavior of custom scalar definitions. */ + const GraphQLSpecifiedByDirective = exports.GraphQLSpecifiedByDirective = new GraphQLDirective({ name: 'specifiedBy', description: 'Exposes a URL that specifies the behavior of this scalar.', @@ -32801,6 +31974,7 @@ const GraphQLSpecifiedByDirective = exports.GraphQLSpecifiedByDirective = new Gr /** * Used to indicate an Input Object is a OneOf Input Object. */ + const GraphQLOneOfDirective = exports.GraphQLOneOfDirective = new GraphQLDirective({ name: 'oneOf', description: 'Indicates exactly one field must be supplied and this field must not be `null`.', @@ -32810,6 +31984,7 @@ const GraphQLOneOfDirective = exports.GraphQLOneOfDirective = new GraphQLDirecti /** * The full list of specified directives. */ + const specifiedDirectives = exports.specifiedDirectives = Object.freeze([GraphQLIncludeDirective, GraphQLSkipDirective, GraphQLDeprecatedDirective, GraphQLSpecifiedByDirective, GraphQLOneOfDirective]); function isSpecifiedDirective(directive) { return specifiedDirectives.some(({ @@ -32854,12 +32029,6 @@ Object.defineProperty(exports, "GraphQLBoolean", ({ return _scalars.GraphQLBoolean; } })); -Object.defineProperty(exports, "GraphQLDeferDirective", ({ - enumerable: true, - get: function () { - return _directives.GraphQLDeferDirective; - } -})); Object.defineProperty(exports, "GraphQLDeprecatedDirective", ({ enumerable: true, get: function () { @@ -32962,12 +32131,6 @@ Object.defineProperty(exports, "GraphQLSpecifiedByDirective", ({ return _directives.GraphQLSpecifiedByDirective; } })); -Object.defineProperty(exports, "GraphQLStreamDirective", ({ - enumerable: true, - get: function () { - return _directives.GraphQLStreamDirective; - } -})); Object.defineProperty(exports, "GraphQLString", ({ enumerable: true, get: function () { @@ -33474,7 +32637,7 @@ const __Directive = exports.__Directive = new _definition.GraphQLObjectType({ resolve(field, { includeDeprecated }) { - return includeDeprecated === true ? field.args : field.args.filter(arg => arg.deprecationReason == null); + return includeDeprecated ? field.args : field.args.filter(arg => arg.deprecationReason == null); } } }) @@ -33594,6 +32757,7 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered) + false || (0, _invariant.invariant)(false, `Unexpected type: "${(0, _inspect.inspect)(type)}".`); } }, @@ -33603,9 +32767,8 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ }, description: { type: _scalars.GraphQLString, - resolve: type => - // FIXME: add test case - /* c8 ignore next */ + resolve: (type // FIXME: add test case + ) => /* c8 ignore next */ 'description' in type ? type.description : undefined }, specifiedByURL: { @@ -33625,7 +32788,7 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ }) { if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type)) { const fields = Object.values(type.getFields()); - return includeDeprecated === true ? fields : fields.filter(field => field.deprecationReason == null); + return includeDeprecated ? fields : fields.filter(field => field.deprecationReason == null); } } }, @@ -33660,7 +32823,7 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ }) { if ((0, _definition.isEnumType)(type)) { const values = type.getValues(); - return includeDeprecated === true ? values : values.filter(field => field.deprecationReason == null); + return includeDeprecated ? values : values.filter(field => field.deprecationReason == null); } } }, @@ -33677,7 +32840,7 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ }) { if ((0, _definition.isInputObjectType)(type)) { const values = Object.values(type.getFields()); - return includeDeprecated === true ? values : values.filter(field => field.deprecationReason == null); + return includeDeprecated ? values : values.filter(field => field.deprecationReason == null); } } }, @@ -33718,7 +32881,7 @@ const __Field = exports.__Field = new _definition.GraphQLObjectType({ resolve(field, { includeDeprecated }) { - return includeDeprecated === true ? field.args : field.args.filter(arg => arg.deprecationReason == null); + return includeDeprecated ? field.args : field.args.filter(arg => arg.deprecationReason == null); } }, type: { @@ -33848,6 +33011,7 @@ const __TypeKind = exports.__TypeKind = new _definition.GraphQLEnumType({ * Note that these are GraphQLField and not GraphQLFieldConfig, * so the format for args is different. */ + const SchemaMetaFieldDef = exports.SchemaMetaFieldDef = { name: '__schema', type: new _definition.GraphQLNonNull(__Schema), @@ -33927,11 +33091,13 @@ var _definition = __webpack_require__(/*! ./definition.mjs */ "../../../node_mod * Maximum possible Int value as per GraphQL Spec (32-bit signed integer). * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe up-to 2^53 - 1 * */ + const GRAPHQL_MAX_INT = exports.GRAPHQL_MAX_INT = 2147483647; /** * Minimum possible Int value as per GraphQL Spec (32-bit signed integer). * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe starting at -(2^53 - 1) * */ + const GRAPHQL_MIN_INT = exports.GRAPHQL_MIN_INT = -2147483648; const GraphQLInt = exports.GraphQLInt = new _definition.GraphQLScalarType({ name: 'Int', @@ -34002,9 +33168,7 @@ const GraphQLFloat = exports.GraphQLFloat = new _definition.GraphQLScalarType({ }, parseLiteral(valueNode) { if (valueNode.kind !== _kinds.Kind.FLOAT && valueNode.kind !== _kinds.Kind.INT) { - throw new _GraphQLError.GraphQLError(`Float cannot represent non numeric value: ${(0, _printer.print)(valueNode)}`, { - nodes: valueNode - }); + throw new _GraphQLError.GraphQLError(`Float cannot represent non numeric value: ${(0, _printer.print)(valueNode)}`, valueNode); } return parseFloat(valueNode.value); } @@ -34013,9 +33177,9 @@ const GraphQLString = exports.GraphQLString = new _definition.GraphQLScalarType( name: 'String', description: 'The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.', serialize(outputValue) { - const coercedValue = serializeObject(outputValue); - // Serialize string, boolean and number values to a string, but do not + const coercedValue = serializeObject(outputValue); // Serialize string, boolean and number values to a string, but do not // attempt to coerce object, function, symbol, or other types as strings. + if (typeof coercedValue === 'string') { return coercedValue; } @@ -34106,10 +33270,10 @@ function isSpecifiedScalarType(type) { return specifiedScalarTypes.some(({ name }) => type.name === name); -} -// Support serializing objects with custom valueOf() or toJSON() functions - +} // Support serializing objects with custom valueOf() or toJSON() functions - // a common way to represent a complex value which can be represented as // a string (ex: MongoDB id objects). + function serializeObject(outputValue) { if ((0, _isObjectLike.isObjectLike)(outputValue)) { if (typeof outputValue.valueOf === 'function') { @@ -34141,8 +33305,10 @@ Object.defineProperty(exports, "__esModule", ({ exports.GraphQLSchema = void 0; exports.assertSchema = assertSchema; exports.isSchema = isSchema; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); +var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _toObjMap = __webpack_require__(/*! ../jsutils/toObjMap.mjs */ "../../../node_modules/graphql/jsutils/toObjMap.mjs"); var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _definition = __webpack_require__(/*! ./definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); @@ -34151,6 +33317,7 @@ var _introspection = __webpack_require__(/*! ./introspection.mjs */ "../../../no /** * Test if the given value is a GraphQL schema. */ + function isSchema(schema) { return (0, _instanceOf.instanceOf)(schema, GraphQLSchema); } @@ -34160,6 +33327,16 @@ function assertSchema(schema) { } return schema; } +/** + * Custom extensions + * + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ + /** * Schema Definition * @@ -34229,22 +33406,28 @@ function assertSchema(schema) { * ``` */ class GraphQLSchema { + // Used as a cache for validateSchema(). constructor(config) { var _config$extensionASTN, _config$directives; + // If this schema was built from a source known to be valid, then it may be // marked with assumeValid to avoid an additional type system validation. - this.__validationErrors = config.assumeValid === true ? [] : undefined; + this.__validationErrors = config.assumeValid === true ? [] : undefined; // Check for common mistakes during construction to produce early errors. + + (0, _isObjectLike.isObjectLike)(config) || (0, _devAssert.devAssert)(false, 'Must provide configuration object.'); + !config.types || Array.isArray(config.types) || (0, _devAssert.devAssert)(false, `"types" must be Array if provided but got: ${(0, _inspect.inspect)(config.types)}.`); + !config.directives || Array.isArray(config.directives) || (0, _devAssert.devAssert)(false, '"directives" must be Array if provided but got: ' + `${(0, _inspect.inspect)(config.directives)}.`); this.description = config.description; this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN = config.extensionASTNodes) !== null && _config$extensionASTN !== void 0 ? _config$extensionASTN : []; this._queryType = config.query; this._mutationType = config.mutation; - this._subscriptionType = config.subscription; - // Provide specified directives (e.g. @include and @skip) by default. - this._directives = (_config$directives = config.directives) !== null && _config$directives !== void 0 ? _config$directives : _directives.specifiedDirectives; - // To preserve order of user-provided types, we add first to add them to + this._subscriptionType = config.subscription; // Provide specified directives (e.g. @include and @skip) by default. + + this._directives = (_config$directives = config.directives) !== null && _config$directives !== void 0 ? _config$directives : _directives.specifiedDirectives; // To preserve order of user-provided types, we add first to add them to // the set of "collected" types, so `collectReferencedTypes` ignore them. + const allReferencedTypes = new Set(config.types); if (config.types != null) { for (const type of config.types) { @@ -34271,17 +33454,18 @@ class GraphQLSchema { } } } - collectReferencedTypes(_introspection.__Schema, allReferencedTypes); - // Storing the resulting map for reference by the schema. + collectReferencedTypes(_introspection.__Schema, allReferencedTypes); // Storing the resulting map for reference by the schema. + this._typeMap = Object.create(null); - this._subTypeMap = new Map(); - // Keep track of all implementations by interface name. + this._subTypeMap = Object.create(null); // Keep track of all implementations by interface name. + this._implementationsMap = Object.create(null); for (const namedType of allReferencedTypes) { if (namedType == null) { continue; } const typeName = namedType.name; + typeName || (0, _devAssert.devAssert)(false, 'One of the provided types for building the Schema is missing a name.'); if (this._typeMap[typeName] !== undefined) { throw new Error(`Schema must contain uniquely named types but contains multiple types named "${typeName}".`); } @@ -34356,17 +33540,25 @@ class GraphQLSchema { }; } isSubType(abstractType, maybeSubType) { - let set = this._subTypeMap.get(abstractType); - if (set === undefined) { + let map = this._subTypeMap[abstractType.name]; + if (map === undefined) { + map = Object.create(null); if ((0, _definition.isUnionType)(abstractType)) { - set = new Set(abstractType.getTypes()); + for (const type of abstractType.getTypes()) { + map[type.name] = true; + } } else { const implementations = this.getImplementations(abstractType); - set = new Set([...implementations.objects, ...implementations.interfaces]); + for (const type of implementations.objects) { + map[type.name] = true; + } + for (const type of implementations.interfaces) { + map[type.name] = true; + } } - this._subTypeMap.set(abstractType, set); + this._subTypeMap[abstractType.name] = map; } - return set.has(maybeSubType); + return map[maybeSubType.name] !== undefined; } getDirectives() { return this._directives; @@ -34374,33 +33566,6 @@ class GraphQLSchema { getDirective(name) { return this.getDirectives().find(directive => directive.name === name); } - /** - * This method looks up the field on the given type definition. - * It has special casing for the three introspection fields, `__schema`, - * `__type` and `__typename`. - * - * `__typename` is special because it can always be queried as a field, even - * in situations where no other fields are allowed, like on a Union. - * - * `__schema` and `__type` could get automatically added to the query type, - * but that would require mutating type definitions, which would cause issues. - */ - getField(parentType, fieldName) { - switch (fieldName) { - case _introspection.SchemaMetaFieldDef.name: - return this.getQueryType() === parentType ? _introspection.SchemaMetaFieldDef : undefined; - case _introspection.TypeMetaFieldDef.name: - return this.getQueryType() === parentType ? _introspection.TypeMetaFieldDef : undefined; - case _introspection.TypeNameMetaFieldDef.name: - return _introspection.TypeNameMetaFieldDef; - } - // this function is part "hot" path inside executor and check presence - // of 'getFields' is faster than to use `!isUnionType` - if ('getFields' in parentType) { - return parentType.getFields()[fieldName]; - } - return undefined; - } toConfig() { return { description: this.description, @@ -34459,9 +33624,6 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.assertValidSchema = assertValidSchema; exports.validateSchema = validateSchema; -var _AccumulatorMap = __webpack_require__(/*! ../jsutils/AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); -var _capitalize = __webpack_require__(/*! ../jsutils/capitalize.mjs */ "../../../node_modules/graphql/jsutils/capitalize.mjs"); -var _formatList = __webpack_require__(/*! ../jsutils/formatList.mjs */ "../../../node_modules/graphql/jsutils/formatList.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); @@ -34477,20 +33639,21 @@ var _schema = __webpack_require__(/*! ./schema.mjs */ "../../../node_modules/gra * Validation runs synchronously, returning an array of encountered errors, or * an empty array if no errors were encountered and the Schema is valid. */ + function validateSchema(schema) { // First check to ensure the provided value is in fact a GraphQLSchema. - (0, _schema.assertSchema)(schema); - // If this Schema has already been validated, return the previous results. + (0, _schema.assertSchema)(schema); // If this Schema has already been validated, return the previous results. + if (schema.__validationErrors) { return schema.__validationErrors; - } - // Validate the schema, producing a list of errors. + } // Validate the schema, producing a list of errors. + const context = new SchemaValidationContext(schema); validateRootTypes(context); validateDirectives(context); - validateTypes(context); - // Persist the results of validation before returning to ensure validation + validateTypes(context); // Persist the results of validation before returning to ensure validation // does not run multiple times for this schema. + const errors = context.getErrors(); schema.__validationErrors = errors; return errors; @@ -34499,6 +33662,7 @@ function validateSchema(schema) { * Utility function which asserts a schema is valid by throwing an error if * it is invalid. */ + function assertValidSchema(schema) { const errors = validateSchema(schema); if (errors.length !== 0) { @@ -34522,28 +33686,22 @@ class SchemaValidationContext { } function validateRootTypes(context) { const schema = context.schema; - if (schema.getQueryType() == null) { + const queryType = schema.getQueryType(); + if (!queryType) { context.reportError('Query root type must be provided.', schema.astNode); + } else if (!(0, _definition.isObjectType)(queryType)) { + var _getOperationTypeNode; + context.reportError(`Query root type must be Object type, it cannot be ${(0, _inspect.inspect)(queryType)}.`, (_getOperationTypeNode = getOperationTypeNode(schema, _ast.OperationTypeNode.QUERY)) !== null && _getOperationTypeNode !== void 0 ? _getOperationTypeNode : queryType.astNode); } - const rootTypesMap = new _AccumulatorMap.AccumulatorMap(); - for (const operationType of Object.values(_ast.OperationTypeNode)) { - const rootType = schema.getRootType(operationType); - if (rootType != null) { - if (!(0, _definition.isObjectType)(rootType)) { - var _getOperationTypeNode; - const operationTypeStr = (0, _capitalize.capitalize)(operationType); - const rootTypeStr = (0, _inspect.inspect)(rootType); - context.reportError(operationType === _ast.OperationTypeNode.QUERY ? `${operationTypeStr} root type must be Object type, it cannot be ${rootTypeStr}.` : `${operationTypeStr} root type must be Object type if provided, it cannot be ${rootTypeStr}.`, (_getOperationTypeNode = getOperationTypeNode(schema, operationType)) !== null && _getOperationTypeNode !== void 0 ? _getOperationTypeNode : rootType.astNode); - } else { - rootTypesMap.add(rootType, operationType); - } - } + const mutationType = schema.getMutationType(); + if (mutationType && !(0, _definition.isObjectType)(mutationType)) { + var _getOperationTypeNode2; + context.reportError('Mutation root type must be Object type if provided, it cannot be ' + `${(0, _inspect.inspect)(mutationType)}.`, (_getOperationTypeNode2 = getOperationTypeNode(schema, _ast.OperationTypeNode.MUTATION)) !== null && _getOperationTypeNode2 !== void 0 ? _getOperationTypeNode2 : mutationType.astNode); } - for (const [rootType, operationTypes] of rootTypesMap) { - if (operationTypes.length > 1) { - const operationList = (0, _formatList.andList)(operationTypes); - context.reportError(`All root types must be different, "${rootType.name}" type is used as ${operationList} root types.`, operationTypes.map(operationType => getOperationTypeNode(schema, operationType))); - } + const subscriptionType = schema.getSubscriptionType(); + if (subscriptionType && !(0, _definition.isObjectType)(subscriptionType)) { + var _getOperationTypeNode3; + context.reportError('Subscription root type must be Object type if provided, it cannot be ' + `${(0, _inspect.inspect)(subscriptionType)}.`, (_getOperationTypeNode3 = getOperationTypeNode(schema, _ast.OperationTypeNode.SUBSCRIPTION)) !== null && _getOperationTypeNode3 !== void 0 ? _getOperationTypeNode3 : subscriptionType.astNode); } } function getOperationTypeNode(schema, operation) { @@ -34552,7 +33710,9 @@ function getOperationTypeNode(schema, operation) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 schemaNode => { var _schemaNode$operation; - return /* c8 ignore next */(_schemaNode$operation = schemaNode === null || schemaNode === void 0 ? void 0 : schemaNode.operationTypes) !== null && _schemaNode$operation !== void 0 ? _schemaNode$operation : []; + return /* c8 ignore next */( + (_schemaNode$operation = schemaNode === null || schemaNode === void 0 ? void 0 : schemaNode.operationTypes) !== null && _schemaNode$operation !== void 0 ? _schemaNode$operation : [] + ); }).find(operationNode => operationNode.operation === operation)) === null || _flatMap$find === void 0 ? void 0 : _flatMap$find.type; } function validateDirectives(context) { @@ -34561,17 +33721,15 @@ function validateDirectives(context) { if (!(0, _directives.isDirective)(directive)) { context.reportError(`Expected directive but got: ${(0, _inspect.inspect)(directive)}.`, directive === null || directive === void 0 ? void 0 : directive.astNode); continue; - } - // Ensure they are named correctly. - validateName(context, directive); - if (directive.locations.length === 0) { - context.reportError(`Directive @${directive.name} must include 1 or more locations.`, directive.astNode); - } + } // Ensure they are named correctly. + + validateName(context, directive); // TODO: Ensure proper locations. // Ensure the arguments are valid. + for (const arg of directive.args) { // Ensure they are named correctly. - validateName(context, arg); - // Ensure the type is an input type. + validateName(context, arg); // Ensure the type is an input type. + if (!(0, _definition.isInputType)(arg.type)) { context.reportError(`The type of @${directive.name}(${arg.name}:) must be Input Type ` + `but got: ${(0, _inspect.inspect)(arg.type)}.`, arg.astNode); } @@ -34596,20 +33754,20 @@ function validateTypes(context) { if (!(0, _definition.isNamedType)(type)) { context.reportError(`Expected GraphQL named type but got: ${(0, _inspect.inspect)(type)}.`, type.astNode); continue; - } - // Ensure it is named correctly (excluding introspection types). + } // Ensure it is named correctly (excluding introspection types). + if (!(0, _introspection.isIntrospectionType)(type)) { validateName(context, type); } if ((0, _definition.isObjectType)(type)) { // Ensure fields are valid - validateFields(context, type); - // Ensure objects implement the interfaces they claim to. + validateFields(context, type); // Ensure objects implement the interfaces they claim to. + validateInterfaces(context, type); } else if ((0, _definition.isInterfaceType)(type)) { // Ensure fields are valid. - validateFields(context, type); - // Ensure interfaces implement the interfaces they claim to. + validateFields(context, type); // Ensure interfaces implement the interfaces they claim to. + validateInterfaces(context, type); } else if ((0, _definition.isUnionType)(type)) { // Ensure Unions include valid member types. @@ -34619,32 +33777,32 @@ function validateTypes(context) { validateEnumValues(context, type); } else if ((0, _definition.isInputObjectType)(type)) { // Ensure Input Object fields are valid. - validateInputFields(context, type); - // Ensure Input Objects do not contain non-nullable circular references + validateInputFields(context, type); // Ensure Input Objects do not contain non-nullable circular references + validateInputObjectCircularRefs(type); } } } function validateFields(context, type) { - const fields = Object.values(type.getFields()); - // Objects and Interfaces both must define one or more fields. + const fields = Object.values(type.getFields()); // Objects and Interfaces both must define one or more fields. + if (fields.length === 0) { context.reportError(`Type ${type.name} must define one or more fields.`, [type.astNode, ...type.extensionASTNodes]); } for (const field of fields) { // Ensure they are named correctly. - validateName(context, field); - // Ensure the type is an output type + validateName(context, field); // Ensure the type is an output type + if (!(0, _definition.isOutputType)(field.type)) { var _field$astNode; context.reportError(`The type of ${type.name}.${field.name} must be Output Type ` + `but got: ${(0, _inspect.inspect)(field.type)}.`, (_field$astNode = field.astNode) === null || _field$astNode === void 0 ? void 0 : _field$astNode.type); - } - // Ensure the arguments are valid + } // Ensure the arguments are valid + for (const arg of field.args) { - const argName = arg.name; - // Ensure they are named correctly. - validateName(context, arg); - // Ensure the type is an input type + const argName = arg.name; // Ensure they are named correctly. + + validateName(context, arg); // Ensure the type is an input type + if (!(0, _definition.isInputType)(arg.type)) { var _arg$astNode2; context.reportError(`The type of ${type.name}.${field.name}(${argName}:) must be Input ` + `Type but got: ${(0, _inspect.inspect)(arg.type)}.`, (_arg$astNode2 = arg.astNode) === null || _arg$astNode2 === void 0 ? void 0 : _arg$astNode2.type); @@ -34657,7 +33815,7 @@ function validateFields(context, type) { } } function validateInterfaces(context, type) { - const ifaceTypeNames = new Set(); + const ifaceTypeNames = Object.create(null); for (const iface of type.getInterfaces()) { if (!(0, _definition.isInterfaceType)(iface)) { context.reportError(`Type ${(0, _inspect.inspect)(type)} must only implement Interface types, ` + `it cannot implement ${(0, _inspect.inspect)(iface)}.`, getAllImplementsInterfaceNodes(type, iface)); @@ -34667,51 +33825,50 @@ function validateInterfaces(context, type) { context.reportError(`Type ${type.name} cannot implement itself because it would create a circular reference.`, getAllImplementsInterfaceNodes(type, iface)); continue; } - if (ifaceTypeNames.has(iface.name)) { + if (ifaceTypeNames[iface.name]) { context.reportError(`Type ${type.name} can only implement ${iface.name} once.`, getAllImplementsInterfaceNodes(type, iface)); continue; } - ifaceTypeNames.add(iface.name); + ifaceTypeNames[iface.name] = true; validateTypeImplementsAncestors(context, type, iface); validateTypeImplementsInterface(context, type, iface); } } function validateTypeImplementsInterface(context, type, iface) { - const typeFieldMap = type.getFields(); - // Assert each interface field is implemented. + const typeFieldMap = type.getFields(); // Assert each interface field is implemented. + for (const ifaceField of Object.values(iface.getFields())) { const fieldName = ifaceField.name; - const typeField = typeFieldMap[fieldName]; - // Assert interface field exists on type. - if (typeField == null) { + const typeField = typeFieldMap[fieldName]; // Assert interface field exists on type. + + if (!typeField) { context.reportError(`Interface field ${iface.name}.${fieldName} expected but ${type.name} does not provide it.`, [ifaceField.astNode, type.astNode, ...type.extensionASTNodes]); continue; - } - // Assert interface field type is satisfied by type field type, by being + } // Assert interface field type is satisfied by type field type, by being // a valid subtype. (covariant) + if (!(0, _typeComparators.isTypeSubTypeOf)(context.schema, typeField.type, ifaceField.type)) { var _ifaceField$astNode, _typeField$astNode; context.reportError(`Interface field ${iface.name}.${fieldName} expects type ` + `${(0, _inspect.inspect)(ifaceField.type)} but ${type.name}.${fieldName} ` + `is type ${(0, _inspect.inspect)(typeField.type)}.`, [(_ifaceField$astNode = ifaceField.astNode) === null || _ifaceField$astNode === void 0 ? void 0 : _ifaceField$astNode.type, (_typeField$astNode = typeField.astNode) === null || _typeField$astNode === void 0 ? void 0 : _typeField$astNode.type]); - } - // Assert each interface field arg is implemented. + } // Assert each interface field arg is implemented. + for (const ifaceArg of ifaceField.args) { const argName = ifaceArg.name; - const typeArg = typeField.args.find(arg => arg.name === argName); - // Assert interface field arg exists on object field. + const typeArg = typeField.args.find(arg => arg.name === argName); // Assert interface field arg exists on object field. + if (!typeArg) { context.reportError(`Interface field argument ${iface.name}.${fieldName}(${argName}:) expected but ${type.name}.${fieldName} does not provide it.`, [ifaceArg.astNode, typeField.astNode]); continue; - } - // Assert interface field arg type matches object field arg type. + } // Assert interface field arg type matches object field arg type. // (invariant) // TODO: change to contravariant? + if (!(0, _typeComparators.isEqualType)(ifaceArg.type, typeArg.type)) { var _ifaceArg$astNode, _typeArg$astNode; context.reportError(`Interface field argument ${iface.name}.${fieldName}(${argName}:) ` + `expects type ${(0, _inspect.inspect)(ifaceArg.type)} but ` + `${type.name}.${fieldName}(${argName}:) is type ` + `${(0, _inspect.inspect)(typeArg.type)}.`, [(_ifaceArg$astNode = ifaceArg.astNode) === null || _ifaceArg$astNode === void 0 ? void 0 : _ifaceArg$astNode.type, (_typeArg$astNode = typeArg.astNode) === null || _typeArg$astNode === void 0 ? void 0 : _typeArg$astNode.type]); - } - // TODO: validate default values? - } - // Assert additional arguments must not be required. + } // TODO: validate default values? + } // Assert additional arguments must not be required. + for (const typeArg of typeField.args) { const argName = typeArg.name; const ifaceArg = ifaceField.args.find(arg => arg.name === argName); @@ -34734,13 +33891,13 @@ function validateUnionMembers(context, union) { if (memberTypes.length === 0) { context.reportError(`Union type ${union.name} must define one or more member types.`, [union.astNode, ...union.extensionASTNodes]); } - const includedTypeNames = new Set(); + const includedTypeNames = Object.create(null); for (const memberType of memberTypes) { - if (includedTypeNames.has(memberType.name)) { + if (includedTypeNames[memberType.name]) { context.reportError(`Union type ${union.name} can only include type ${memberType.name} once.`, getUnionMemberTypeNodes(union, memberType.name)); continue; } - includedTypeNames.add(memberType.name); + includedTypeNames[memberType.name] = true; if (!(0, _definition.isObjectType)(memberType)) { context.reportError(`Union type ${union.name} can only include Object types, ` + `it cannot include ${(0, _inspect.inspect)(memberType)}.`, getUnionMemberTypeNodes(union, String(memberType))); } @@ -34760,12 +33917,12 @@ function validateInputFields(context, inputObj) { const fields = Object.values(inputObj.getFields()); if (fields.length === 0) { context.reportError(`Input Object type ${inputObj.name} must define one or more fields.`, [inputObj.astNode, ...inputObj.extensionASTNodes]); - } - // Ensure the arguments are valid + } // Ensure the arguments are valid + for (const field of fields) { // Ensure they are named correctly. - validateName(context, field); - // Ensure the type is an input type + validateName(context, field); // Ensure the type is an input type + if (!(0, _definition.isInputType)(field.type)) { var _field$astNode2; context.reportError(`The type of ${inputObj.name}.${field.name} must be Input Type ` + `but got: ${(0, _inspect.inspect)(field.type)}.`, (_field$astNode2 = field.astNode) === null || _field$astNode2 === void 0 ? void 0 : _field$astNode2.type); @@ -34792,20 +33949,20 @@ function createInputObjectCircularRefsValidator(context) { // Modified copy of algorithm from 'src/validation/rules/NoFragmentCycles.js'. // Tracks already visited types to maintain O(N) and to ensure that cycles // are not redundantly reported. - const visitedTypes = new Set(); - // Array of types nodes used to produce meaningful errors - const fieldPath = []; - // Position in the type path + const visitedTypes = Object.create(null); // Array of types nodes used to produce meaningful errors + + const fieldPath = []; // Position in the type path + const fieldPathIndexByTypeName = Object.create(null); - return detectCycleRecursive; - // This does a straight-forward DFS to find cycles. + return detectCycleRecursive; // This does a straight-forward DFS to find cycles. // It does not terminate when a cycle was found but continues to explore // the graph to find all possible cycles. + function detectCycleRecursive(inputObj) { - if (visitedTypes.has(inputObj)) { + if (visitedTypes[inputObj.name]) { return; } - visitedTypes.add(inputObj); + visitedTypes[inputObj.name] = true; fieldPathIndexByTypeName[inputObj.name] = fieldPath.length; const fields = Object.values(inputObj.getFields()); for (const field of fields) { @@ -34831,11 +33988,13 @@ function getAllImplementsInterfaceNodes(type, iface) { astNode, extensionASTNodes } = type; - const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + return nodes.flatMap(typeNode => { var _typeNode$interfaces; - return /* c8 ignore next */(_typeNode$interfaces = typeNode.interfaces) !== null && _typeNode$interfaces !== void 0 ? _typeNode$interfaces : []; + return /* c8 ignore next */( + (_typeNode$interfaces = typeNode.interfaces) !== null && _typeNode$interfaces !== void 0 ? _typeNode$interfaces : [] + ); }).filter(ifaceNode => ifaceNode.name.value === iface.name); } function getUnionMemberTypeNodes(union, typeName) { @@ -34843,11 +34002,13 @@ function getUnionMemberTypeNodes(union, typeName) { astNode, extensionASTNodes } = union; - const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + return nodes.flatMap(unionNode => { var _unionNode$types; - return /* c8 ignore next */(_unionNode$types = unionNode.types) !== null && _unionNode$types !== void 0 ? _unionNode$types : []; + return /* c8 ignore next */( + (_unionNode$types = unionNode.types) !== null && _unionNode$types !== void 0 ? _unionNode$types : [] + ); }).filter(typeNode => typeNode.name.value === typeName); } function getDeprecatedDirectiveNode(definitionNode) { @@ -34874,12 +34035,14 @@ var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _visitor = __webpack_require__(/*! ../language/visitor.mjs */ "../../../node_modules/graphql/language/visitor.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); +var _introspection = __webpack_require__(/*! ../type/introspection.mjs */ "../../../node_modules/graphql/type/introspection.mjs"); var _typeFromAST = __webpack_require__(/*! ./typeFromAST.mjs */ "../../../node_modules/graphql/utilities/typeFromAST.mjs"); /** * TypeInfo is a utility class which, given a GraphQL schema, can keep track * of the current field and type definitions at any point in a GraphQL document * AST during a recursive descent by calling `enter(node)` and `leave(node)`. */ + class TypeInfo { constructor(schema, /** @@ -34914,22 +34077,34 @@ class TypeInfo { return 'TypeInfo'; } getType() { - return this._typeStack.at(-1); + if (this._typeStack.length > 0) { + return this._typeStack[this._typeStack.length - 1]; + } } getParentType() { - return this._parentTypeStack.at(-1); + if (this._parentTypeStack.length > 0) { + return this._parentTypeStack[this._parentTypeStack.length - 1]; + } } getInputType() { - return this._inputTypeStack.at(-1); + if (this._inputTypeStack.length > 0) { + return this._inputTypeStack[this._inputTypeStack.length - 1]; + } } getParentInputType() { - return this._inputTypeStack.at(-2); + if (this._inputTypeStack.length > 1) { + return this._inputTypeStack[this._inputTypeStack.length - 2]; + } } getFieldDef() { - return this._fieldDefStack.at(-1); + if (this._fieldDefStack.length > 0) { + return this._fieldDefStack[this._fieldDefStack.length - 1]; + } } getDefaultValue() { - return this._defaultValueStack.at(-1); + if (this._defaultValueStack.length > 0) { + return this._defaultValueStack[this._defaultValueStack.length - 1]; + } } getDirective() { return this._directive; @@ -34941,11 +34116,11 @@ class TypeInfo { return this._enumValue; } enter(node) { - const schema = this._schema; - // Note: many of the types below are explicitly typed as "unknown" to drop + const schema = this._schema; // Note: many of the types below are explicitly typed as "unknown" to drop // any assumptions of a valid schema to ensure runtime types are properly // checked before continuing since TypeInfo is used as part of validation // which occurs before guarantees of schema and document validity. + switch (node.kind) { case _kinds.Kind.SELECTION_SET: { @@ -35011,8 +34186,8 @@ class TypeInfo { case _kinds.Kind.LIST: { const listType = (0, _definition.getNullableType)(this.getInputType()); - const itemType = (0, _definition.isListType)(listType) ? listType.ofType : listType; - // List positions never have a default value. + const itemType = (0, _definition.isListType)(listType) ? listType.ofType : listType; // List positions never have a default value. + this._defaultValueStack.push(undefined); this._inputTypeStack.push((0, _definition.isInputType)(itemType) ? itemType : undefined); break; @@ -35024,7 +34199,7 @@ class TypeInfo { let inputField; if ((0, _definition.isInputObjectType)(objectType)) { inputField = objectType.getFields()[node.name.value]; - if (inputField != null) { + if (inputField) { inputFieldType = inputField.type; } } @@ -35042,8 +34217,7 @@ class TypeInfo { this._enumValue = enumValue; break; } - default: - // Ignore other nodes + default: // Ignore other nodes } } leave(node) { @@ -35079,19 +34253,37 @@ class TypeInfo { case _kinds.Kind.ENUM: this._enumValue = null; break; - default: - // Ignore other nodes + default: // Ignore other nodes } } } + +/** + * Not exactly the same as the executor's definition of getFieldDef, in this + * statically evaluated environment we do not always have an Object type, + * and need to handle Interface and Union types. + */ exports.TypeInfo = TypeInfo; function getFieldDef(schema, parentType, fieldNode) { - return schema.getField(parentType, fieldNode.name.value); + const name = fieldNode.name.value; + if (name === _introspection.SchemaMetaFieldDef.name && schema.getQueryType() === parentType) { + return _introspection.SchemaMetaFieldDef; + } + if (name === _introspection.TypeMetaFieldDef.name && schema.getQueryType() === parentType) { + return _introspection.TypeMetaFieldDef; + } + if (name === _introspection.TypeNameMetaFieldDef.name && (0, _definition.isCompositeType)(parentType)) { + return _introspection.TypeNameMetaFieldDef; + } + if ((0, _definition.isObjectType)(parentType) || (0, _definition.isInterfaceType)(parentType)) { + return parentType.getFields()[name]; + } } /** * Creates a new visitor instance which maintains a provided TypeInfo instance * along with visiting visitor. */ + function visitWithTypeInfo(typeInfo, visitor) { return { enter(...args) { @@ -35124,6 +34316,56 @@ function visitWithTypeInfo(typeInfo, visitor) { /***/ }), +/***/ "../../../node_modules/graphql/utilities/assertValidName.mjs": +/*!*******************************************************************!*\ + !*** ../../../node_modules/graphql/utilities/assertValidName.mjs ***! + \*******************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.assertValidName = assertValidName; +exports.isValidNameError = isValidNameError; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +var _assertName = __webpack_require__(/*! ../type/assertName.mjs */ "../../../node_modules/graphql/type/assertName.mjs"); +/* c8 ignore start */ + +/** + * Upholds the spec rules about naming. + * @deprecated Please use `assertName` instead. Will be removed in v17 + */ + +function assertValidName(name) { + const error = isValidNameError(name); + if (error) { + throw error; + } + return name; +} +/** + * Returns an Error if a name is invalid. + * @deprecated Please use `assertName` instead. Will be removed in v17 + */ + +function isValidNameError(name) { + typeof name === 'string' || (0, _devAssert.devAssert)(false, 'Expected name to be a string.'); + if (name.startsWith('__')) { + return new _GraphQLError.GraphQLError(`Name "${name}" must not begin with "__", which is reserved by GraphQL introspection.`); + } + try { + (0, _assertName.assertName)(name); + } catch (error) { + return error; + } +} +/* c8 ignore stop */ + +/***/ }), + /***/ "../../../node_modules/graphql/utilities/astFromValue.mjs": /*!****************************************************************!*\ !*** ../../../node_modules/graphql/utilities/astFromValue.mjs ***! @@ -35164,6 +34406,7 @@ var _scalars = __webpack_require__(/*! ../type/scalars.mjs */ "../../../node_mod * | null | NullValue | * */ + function astFromValue(value, type) { if ((0, _definition.isNonNullType)(type)) { const astValue = astFromValue(value, type.ofType); @@ -35171,19 +34414,19 @@ function astFromValue(value, type) { return null; } return astValue; - } - // only explicit null, not undefined, NaN + } // only explicit null, not undefined, NaN + if (value === null) { return { kind: _kinds.Kind.NULL }; - } - // undefined + } // undefined + if (value === undefined) { return null; - } - // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but + } // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but // the value is not an array, convert the value using the list's item type. + if ((0, _definition.isListType)(type)) { const itemType = type.ofType; if ((0, _isIterableObject.isIterableObject)(value)) { @@ -35200,9 +34443,9 @@ function astFromValue(value, type) { }; } return astFromValue(value, itemType); - } - // Populate the fields of the input object by creating ASTs from each value + } // Populate the fields of the input object by creating ASTs from each value // in the JavaScript object according to the fields in the input type. + if ((0, _definition.isInputObjectType)(type)) { if (!(0, _isObjectLike.isObjectLike)(value)) { return null; @@ -35232,15 +34475,15 @@ function astFromValue(value, type) { const serialized = type.serialize(value); if (serialized == null) { return null; - } - // Others serialize based on their corresponding JavaScript scalar types. + } // Others serialize based on their corresponding JavaScript scalar types. + if (typeof serialized === 'boolean') { return { kind: _kinds.Kind.BOOLEAN, value: serialized }; - } - // JavaScript numbers can be Int or Float values. + } // JavaScript numbers can be Int or Float values. + if (typeof serialized === 'number' && Number.isFinite(serialized)) { const stringNum = String(serialized); return integerStringRegExp.test(stringNum) ? { @@ -35258,8 +34501,8 @@ function astFromValue(value, type) { kind: _kinds.Kind.ENUM, value: serialized }; - } - // ID types can use Int literals. + } // ID types can use Int literals. + if (type === _scalars.GraphQLID && integerStringRegExp.test(serialized)) { return { kind: _kinds.Kind.INT, @@ -35275,6 +34518,7 @@ function astFromValue(value, type) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected input type: ' + (0, _inspect.inspect)(type)); } /** @@ -35282,6 +34526,7 @@ function astFromValue(value, type) { * - NegativeSign? 0 * - NegativeSign? NonZeroDigit ( Digit+ )? */ + const integerStringRegExp = /^-?(?:0|[1-9][0-9]*)$/; /***/ }), @@ -35299,6 +34544,8 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.buildASTSchema = buildASTSchema; exports.buildSchema = buildSchema; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _parser = __webpack_require__(/*! ../language/parser.mjs */ "../../../node_modules/graphql/language/parser.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); var _schema = __webpack_require__(/*! ../type/schema.mjs */ "../../../node_modules/graphql/type/schema.mjs"); @@ -35315,6 +34562,7 @@ var _extendSchema = __webpack_require__(/*! ./extendSchema.mjs */ "../../../node * has no resolve methods, so execution will use default resolvers. */ function buildASTSchema(documentAST, options) { + documentAST != null && documentAST.kind === _kinds.Kind.DOCUMENT || (0, _devAssert.devAssert)(false, 'Must provide valid Document AST.'); if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) { (0, _validate.assertValidSDL)(documentAST); } @@ -35360,6 +34608,7 @@ function buildASTSchema(documentAST, options) { * A helper function to build a GraphQLSchema directly from a source * document. */ + function buildSchema(source, options) { const document = (0, _parser.parse)(source, { noLocation: options === null || options === void 0 ? void 0 : options.noLocation, @@ -35408,50 +34657,49 @@ var _valueFromAST = __webpack_require__(/*! ./valueFromAST.mjs */ "../../../node * This function expects a complete introspection result. Don't forget to check * the "errors" field of a server response before calling this function. */ + function buildClientSchema(introspection, options) { - // Even though the `introspection` argument is typed, in most cases it's received - // as an untyped value from the server, so we will do an additional check here. - (0, _isObjectLike.isObjectLike)(introspection) && (0, _isObjectLike.isObjectLike)(introspection.__schema) || (0, _devAssert.devAssert)(false, `Invalid or incomplete introspection result. Ensure that you are passing "data" property of introspection response and no "errors" was returned alongside: ${(0, _inspect.inspect)(introspection)}.`); - // Get the schema from the introspection result. - const schemaIntrospection = introspection.__schema; - // Iterate through all types, getting the type definition for each. - const typeMap = new Map(schemaIntrospection.types.map(typeIntrospection => [typeIntrospection.name, buildType(typeIntrospection)])); - // Include standard types only if they are used. + (0, _isObjectLike.isObjectLike)(introspection) && (0, _isObjectLike.isObjectLike)(introspection.__schema) || (0, _devAssert.devAssert)(false, `Invalid or incomplete introspection result. Ensure that you are passing "data" property of introspection response and no "errors" was returned alongside: ${(0, _inspect.inspect)(introspection)}.`); // Get the schema from the introspection result. + + const schemaIntrospection = introspection.__schema; // Iterate through all types, getting the type definition for each. + + const typeMap = (0, _keyValMap.keyValMap)(schemaIntrospection.types, typeIntrospection => typeIntrospection.name, typeIntrospection => buildType(typeIntrospection)); // Include standard types only if they are used. + for (const stdType of [..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes]) { - if (typeMap.has(stdType.name)) { - typeMap.set(stdType.name, stdType); + if (typeMap[stdType.name]) { + typeMap[stdType.name] = stdType; } - } - // Get the root Query, Mutation, and Subscription types. - const queryType = schemaIntrospection.queryType != null ? getObjectType(schemaIntrospection.queryType) : null; - const mutationType = schemaIntrospection.mutationType != null ? getObjectType(schemaIntrospection.mutationType) : null; - const subscriptionType = schemaIntrospection.subscriptionType != null ? getObjectType(schemaIntrospection.subscriptionType) : null; - // Get the directives supported by Introspection, assuming empty-set if + } // Get the root Query, Mutation, and Subscription types. + + const queryType = schemaIntrospection.queryType ? getObjectType(schemaIntrospection.queryType) : null; + const mutationType = schemaIntrospection.mutationType ? getObjectType(schemaIntrospection.mutationType) : null; + const subscriptionType = schemaIntrospection.subscriptionType ? getObjectType(schemaIntrospection.subscriptionType) : null; // Get the directives supported by Introspection, assuming empty-set if // directives were not queried for. - const directives = schemaIntrospection.directives != null ? schemaIntrospection.directives.map(buildDirective) : []; - // Then produce and return a Schema with these types. + + const directives = schemaIntrospection.directives ? schemaIntrospection.directives.map(buildDirective) : []; // Then produce and return a Schema with these types. + return new _schema.GraphQLSchema({ description: schemaIntrospection.description, query: queryType, mutation: mutationType, subscription: subscriptionType, - types: [...typeMap.values()], + types: Object.values(typeMap), directives, assumeValid: options === null || options === void 0 ? void 0 : options.assumeValid - }); - // Given a type reference in introspection, return the GraphQLType instance. + }); // Given a type reference in introspection, return the GraphQLType instance. // preferring cached instances before building new instances. + function getType(typeRef) { if (typeRef.kind === _introspection.TypeKind.LIST) { const itemRef = typeRef.ofType; - if (itemRef == null) { + if (!itemRef) { throw new Error('Decorated type deeper than introspection query.'); } return new _definition.GraphQLList(getType(itemRef)); } if (typeRef.kind === _introspection.TypeKind.NON_NULL) { const nullableRef = typeRef.ofType; - if (nullableRef == null) { + if (!nullableRef) { throw new Error('Decorated type deeper than introspection query.'); } const nullableType = getType(nullableRef); @@ -35464,8 +34712,8 @@ function buildClientSchema(introspection, options) { if (!typeName) { throw new Error(`Unknown type reference: ${(0, _inspect.inspect)(typeRef)}.`); } - const type = typeMap.get(typeName); - if (type == null) { + const type = typeMap[typeName]; + if (!type) { throw new Error(`Invalid or incomplete schema, unknown type: ${typeName}. Ensure that a full introspection query is used in order to build a client schema.`); } return type; @@ -35475,9 +34723,9 @@ function buildClientSchema(introspection, options) { } function getInterfaceType(typeRef) { return (0, _definition.assertInterfaceType)(getNamedType(typeRef)); - } - // Given a type's introspection result, construct the correct + } // Given a type's introspection result, construct the correct // GraphQLType instance. + function buildType(type) { // eslint-disable-next-line @typescript-eslint/prefer-optional-chain if (type != null && type.name != null && type.kind != null) { @@ -35514,7 +34762,7 @@ function buildClientSchema(introspection, options) { if (implementingIntrospection.interfaces === null && implementingIntrospection.kind === _introspection.TypeKind.INTERFACE) { return []; } - if (implementingIntrospection.interfaces == null) { + if (!implementingIntrospection.interfaces) { const implementingIntrospectionStr = (0, _inspect.inspect)(implementingIntrospection); throw new Error(`Introspection result missing interfaces: ${implementingIntrospectionStr}.`); } @@ -35537,7 +34785,7 @@ function buildClientSchema(introspection, options) { }); } function buildUnionDef(unionIntrospection) { - if (unionIntrospection.possibleTypes == null) { + if (!unionIntrospection.possibleTypes) { const unionIntrospectionStr = (0, _inspect.inspect)(unionIntrospection); throw new Error(`Introspection result missing possibleTypes: ${unionIntrospectionStr}.`); } @@ -35548,7 +34796,7 @@ function buildClientSchema(introspection, options) { }); } function buildEnumDef(enumIntrospection) { - if (enumIntrospection.enumValues == null) { + if (!enumIntrospection.enumValues) { const enumIntrospectionStr = (0, _inspect.inspect)(enumIntrospection); throw new Error(`Introspection result missing enumValues: ${enumIntrospectionStr}.`); } @@ -35562,7 +34810,7 @@ function buildClientSchema(introspection, options) { }); } function buildInputObjectDef(inputObjectIntrospection) { - if (inputObjectIntrospection.inputFields == null) { + if (!inputObjectIntrospection.inputFields) { const inputObjectIntrospectionStr = (0, _inspect.inspect)(inputObjectIntrospection); throw new Error(`Introspection result missing inputFields: ${inputObjectIntrospectionStr}.`); } @@ -35574,7 +34822,7 @@ function buildClientSchema(introspection, options) { }); } function buildFieldDefMap(typeIntrospection) { - if (typeIntrospection.fields == null) { + if (!typeIntrospection.fields) { throw new Error(`Introspection result missing fields: ${(0, _inspect.inspect)(typeIntrospection)}.`); } return (0, _keyValMap.keyValMap)(typeIntrospection.fields, fieldIntrospection => fieldIntrospection.name, buildField); @@ -35585,7 +34833,7 @@ function buildClientSchema(introspection, options) { const typeStr = (0, _inspect.inspect)(type); throw new Error(`Introspection must provide output type for fields, but received: ${typeStr}.`); } - if (fieldIntrospection.args == null) { + if (!fieldIntrospection.args) { const fieldIntrospectionStr = (0, _inspect.inspect)(fieldIntrospection); throw new Error(`Introspection result missing field args: ${fieldIntrospectionStr}.`); } @@ -35614,11 +34862,11 @@ function buildClientSchema(introspection, options) { }; } function buildDirective(directiveIntrospection) { - if (directiveIntrospection.args == null) { + if (!directiveIntrospection.args) { const directiveIntrospectionStr = (0, _inspect.inspect)(directiveIntrospection); throw new Error(`Introspection result missing directive args: ${directiveIntrospectionStr}.`); } - if (directiveIntrospection.locations == null) { + if (!directiveIntrospection.locations) { const directiveIntrospectionStr = (0, _inspect.inspect)(directiveIntrospection); throw new Error(`Introspection result missing directive locations: ${directiveIntrospectionStr}.`); } @@ -35689,8 +34937,8 @@ function coerceInputValueImpl(inputValue, type, onError, path) { const itemPath = (0, _Path.addPath)(path, index, undefined); return coerceInputValueImpl(itemValue, itemType, onError, itemPath); }); - } - // Lists accept a non-list value as a list of one. + } // Lists accept a non-list value as a list of one. + return [coerceInputValueImpl(inputValue, itemType, onError, path)]; } if ((0, _definition.isInputObjectType)(type)) { @@ -35712,10 +34960,10 @@ function coerceInputValueImpl(inputValue, type, onError, path) { continue; } coercedValue[field.name] = coerceInputValueImpl(fieldValue, field.type, onError, (0, _Path.addPath)(path, field.name, type.name)); - } - // Ensure every provided field is defined. + } // Ensure every provided field is defined. + for (const fieldName of Object.keys(inputValue)) { - if (fieldDefs[fieldName] == null) { + if (!fieldDefs[fieldName]) { const suggestions = (0, _suggestionList.suggestionList)(fieldName, Object.keys(type.getFields())); onError((0, _Path.pathToArray)(path), inputValue, new _GraphQLError.GraphQLError(`Field "${fieldName}" is not defined by type "${type.name}".` + (0, _didYouMean.didYouMean)(suggestions))); } @@ -35734,10 +34982,10 @@ function coerceInputValueImpl(inputValue, type, onError, path) { return coercedValue; } if ((0, _definition.isLeafType)(type)) { - let parseResult; - // Scalars and Enums determine if an input value is valid via parseValue(), + let parseResult; // Scalars and Enums determine if a input value is valid via parseValue(), // which can throw to indicate failure. If it throws, maintain a reference // to the original error. + try { parseResult = type.parseValue(inputValue); } catch (error) { @@ -35757,6 +35005,7 @@ function coerceInputValueImpl(inputValue, type, onError, path) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected input type: ' + (0, _inspect.inspect)(type)); } @@ -35780,6 +35029,7 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * concatenate the ASTs together into batched AST, useful for validating many * GraphQL source files which together represent one conceptual application. */ + function concatAST(documents) { const definitions = []; for (const doc of documents) { @@ -35806,11 +35056,13 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.extendSchema = extendSchema; exports.extendSchemaImpl = extendSchemaImpl; -var _AccumulatorMap = __webpack_require__(/*! ../jsutils/AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _mapValue = __webpack_require__(/*! ../jsutils/mapValue.mjs */ "../../../node_modules/graphql/jsutils/mapValue.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); +var _predicates = __webpack_require__(/*! ../language/predicates.mjs */ "../../../node_modules/graphql/language/predicates.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); var _introspection = __webpack_require__(/*! ../type/introspection.mjs */ "../../../node_modules/graphql/type/introspection.mjs"); @@ -35833,6 +35085,7 @@ var _valueFromAST = __webpack_require__(/*! ./valueFromAST.mjs */ "../../../node */ function extendSchema(schema, documentAST, options) { (0, _schema.assertSchema)(schema); + documentAST != null && documentAST.kind === _kinds.Kind.DOCUMENT || (0, _devAssert.devAssert)(false, 'Must provide valid Document AST.'); if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) { (0, _validate.assertValidSDLExtension)(documentAST, schema); } @@ -35843,77 +35096,47 @@ function extendSchema(schema, documentAST, options) { /** * @internal */ + function extendSchemaImpl(schemaConfig, documentAST, options) { - var _schemaDef$descriptio, _schemaDef, _schemaDef$descriptio2, _schemaDef2, _options$assumeValid; + var _schemaDef, _schemaDef$descriptio, _schemaDef2, _options$assumeValid; + // Collect the type definitions and extensions found in the document. const typeDefs = []; - const scalarExtensions = new _AccumulatorMap.AccumulatorMap(); - const objectExtensions = new _AccumulatorMap.AccumulatorMap(); - const interfaceExtensions = new _AccumulatorMap.AccumulatorMap(); - const unionExtensions = new _AccumulatorMap.AccumulatorMap(); - const enumExtensions = new _AccumulatorMap.AccumulatorMap(); - const inputObjectExtensions = new _AccumulatorMap.AccumulatorMap(); - // New directives and types are separate because a directives and types can + const typeExtensionsMap = Object.create(null); // New directives and types are separate because a directives and types can // have the same name. For example, a type named "skip". + const directiveDefs = []; - let schemaDef; - // Schema extensions are collected which may add additional operation types. + let schemaDef; // Schema extensions are collected which may add additional operation types. + const schemaExtensions = []; - let isSchemaChanged = false; for (const def of documentAST.definitions) { - switch (def.kind) { - case _kinds.Kind.SCHEMA_DEFINITION: - schemaDef = def; - break; - case _kinds.Kind.SCHEMA_EXTENSION: - schemaExtensions.push(def); - break; - case _kinds.Kind.DIRECTIVE_DEFINITION: - directiveDefs.push(def); - break; - // Type Definitions - case _kinds.Kind.SCALAR_TYPE_DEFINITION: - case _kinds.Kind.OBJECT_TYPE_DEFINITION: - case _kinds.Kind.INTERFACE_TYPE_DEFINITION: - case _kinds.Kind.UNION_TYPE_DEFINITION: - case _kinds.Kind.ENUM_TYPE_DEFINITION: - case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION: - typeDefs.push(def); - break; - // Type System Extensions - case _kinds.Kind.SCALAR_TYPE_EXTENSION: - scalarExtensions.add(def.name.value, def); - break; - case _kinds.Kind.OBJECT_TYPE_EXTENSION: - objectExtensions.add(def.name.value, def); - break; - case _kinds.Kind.INTERFACE_TYPE_EXTENSION: - interfaceExtensions.add(def.name.value, def); - break; - case _kinds.Kind.UNION_TYPE_EXTENSION: - unionExtensions.add(def.name.value, def); - break; - case _kinds.Kind.ENUM_TYPE_EXTENSION: - enumExtensions.add(def.name.value, def); - break; - case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION: - inputObjectExtensions.add(def.name.value, def); - break; - default: - continue; + if (def.kind === _kinds.Kind.SCHEMA_DEFINITION) { + schemaDef = def; + } else if (def.kind === _kinds.Kind.SCHEMA_EXTENSION) { + schemaExtensions.push(def); + } else if ((0, _predicates.isTypeDefinitionNode)(def)) { + typeDefs.push(def); + } else if ((0, _predicates.isTypeExtensionNode)(def)) { + const extendedTypeName = def.name.value; + const existingTypeExtensions = typeExtensionsMap[extendedTypeName]; + typeExtensionsMap[extendedTypeName] = existingTypeExtensions ? existingTypeExtensions.concat([def]) : [def]; + } else if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { + directiveDefs.push(def); } - isSchemaChanged = true; - } - // If this document contains no new types, extensions, or directives then + } // If this document contains no new types, extensions, or directives then // return the same unmodified GraphQLSchema instance. - if (!isSchemaChanged) { + + if (Object.keys(typeExtensionsMap).length === 0 && typeDefs.length === 0 && directiveDefs.length === 0 && schemaExtensions.length === 0 && schemaDef == null) { return schemaConfig; } - const typeMap = new Map(schemaConfig.types.map(type => [type.name, extendNamedType(type)])); + const typeMap = Object.create(null); + for (const existingType of schemaConfig.types) { + typeMap[existingType.name] = extendNamedType(existingType); + } for (const typeNode of typeDefs) { - var _stdTypeMap$get; + var _stdTypeMap$name; const name = typeNode.name.value; - typeMap.set(name, (_stdTypeMap$get = stdTypeMap.get(name)) !== null && _stdTypeMap$get !== void 0 ? _stdTypeMap$get : buildType(typeNode)); + typeMap[name] = (_stdTypeMap$name = stdTypeMap[name]) !== null && _stdTypeMap$name !== void 0 ? _stdTypeMap$name : buildType(typeNode); } const operationTypes = { // Get the extended root operation types. @@ -35923,20 +35146,20 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { // Then, incorporate schema definition and all schema extensions. ...(schemaDef && getOperationTypes([schemaDef])), ...getOperationTypes(schemaExtensions) - }; - // Then produce and return a Schema config with these types. + }; // Then produce and return a Schema config with these types. + return { - description: (_schemaDef$descriptio = (_schemaDef = schemaDef) === null || _schemaDef === void 0 ? void 0 : (_schemaDef$descriptio2 = _schemaDef.description) === null || _schemaDef$descriptio2 === void 0 ? void 0 : _schemaDef$descriptio2.value) !== null && _schemaDef$descriptio !== void 0 ? _schemaDef$descriptio : schemaConfig.description, + description: (_schemaDef = schemaDef) === null || _schemaDef === void 0 ? void 0 : (_schemaDef$descriptio = _schemaDef.description) === null || _schemaDef$descriptio === void 0 ? void 0 : _schemaDef$descriptio.value, ...operationTypes, - types: Array.from(typeMap.values()), + types: Object.values(typeMap), directives: [...schemaConfig.directives.map(replaceDirective), ...directiveDefs.map(buildDirective)], - extensions: schemaConfig.extensions, + extensions: Object.create(null), astNode: (_schemaDef2 = schemaDef) !== null && _schemaDef2 !== void 0 ? _schemaDef2 : schemaConfig.astNode, extensionASTNodes: schemaConfig.extensionASTNodes.concat(schemaExtensions), assumeValid: (_options$assumeValid = options === null || options === void 0 ? void 0 : options.assumeValid) !== null && _options$assumeValid !== void 0 ? _options$assumeValid : false - }; - // Below are functions used for producing this schema that have closed over + }; // Below are functions used for producing this schema that have closed over // this scope and have access to the schema, cache, and newly defined types. + function replaceType(type) { if ((0, _definition.isListType)(type)) { // @ts-expect-error @@ -35945,21 +35168,17 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { if ((0, _definition.isNonNullType)(type)) { // @ts-expect-error return new _definition.GraphQLNonNull(replaceType(type.ofType)); - } - // @ts-expect-error FIXME + } // @ts-expect-error FIXME + return replaceNamedType(type); } function replaceNamedType(type) { // Note: While this could make early assertions to get the correctly // typed values, that would throw immediately while type system // validation with validateSchema() will produce more actionable results. - return typeMap.get(type.name); + return typeMap[type.name]; } function replaceDirective(directive) { - if ((0, _directives.isSpecifiedDirective)(directive)) { - // Builtin directives are not extended. - return directive; - } const config = directive.toConfig(); return new _directives.GraphQLDirective({ ...config, @@ -35991,12 +35210,13 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } /* c8 ignore next 3 */ // Not reachable, all possible type definition nodes have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function extendInputObjectType(type) { - var _inputObjectExtension; + var _typeExtensionsMap$co; const config = type.toConfig(); - const extensions = (_inputObjectExtension = inputObjectExtensions.get(config.name)) !== null && _inputObjectExtension !== void 0 ? _inputObjectExtension : []; + const extensions = (_typeExtensionsMap$co = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co !== void 0 ? _typeExtensionsMap$co : []; return new _definition.GraphQLInputObjectType({ ...config, fields: () => ({ @@ -36010,9 +35230,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendEnumType(type) { - var _enumExtensions$get; + var _typeExtensionsMap$ty; const config = type.toConfig(); - const extensions = (_enumExtensions$get = enumExtensions.get(type.name)) !== null && _enumExtensions$get !== void 0 ? _enumExtensions$get : []; + const extensions = (_typeExtensionsMap$ty = typeExtensionsMap[type.name]) !== null && _typeExtensionsMap$ty !== void 0 ? _typeExtensionsMap$ty : []; return new _definition.GraphQLEnumType({ ...config, values: { @@ -36023,9 +35243,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendScalarType(type) { - var _scalarExtensions$get; + var _typeExtensionsMap$co2; const config = type.toConfig(); - const extensions = (_scalarExtensions$get = scalarExtensions.get(config.name)) !== null && _scalarExtensions$get !== void 0 ? _scalarExtensions$get : []; + const extensions = (_typeExtensionsMap$co2 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co2 !== void 0 ? _typeExtensionsMap$co2 : []; let specifiedByURL = config.specifiedByURL; for (const extensionNode of extensions) { var _getSpecifiedByURL; @@ -36038,9 +35258,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendObjectType(type) { - var _objectExtensions$get; + var _typeExtensionsMap$co3; const config = type.toConfig(); - const extensions = (_objectExtensions$get = objectExtensions.get(config.name)) !== null && _objectExtensions$get !== void 0 ? _objectExtensions$get : []; + const extensions = (_typeExtensionsMap$co3 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co3 !== void 0 ? _typeExtensionsMap$co3 : []; return new _definition.GraphQLObjectType({ ...config, interfaces: () => [...type.getInterfaces().map(replaceNamedType), ...buildInterfaces(extensions)], @@ -36052,9 +35272,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendInterfaceType(type) { - var _interfaceExtensions$; + var _typeExtensionsMap$co4; const config = type.toConfig(); - const extensions = (_interfaceExtensions$ = interfaceExtensions.get(config.name)) !== null && _interfaceExtensions$ !== void 0 ? _interfaceExtensions$ : []; + const extensions = (_typeExtensionsMap$co4 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co4 !== void 0 ? _typeExtensionsMap$co4 : []; return new _definition.GraphQLInterfaceType({ ...config, interfaces: () => [...type.getInterfaces().map(replaceNamedType), ...buildInterfaces(extensions)], @@ -36066,9 +35286,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendUnionType(type) { - var _unionExtensions$get; + var _typeExtensionsMap$co5; const config = type.toConfig(); - const extensions = (_unionExtensions$get = unionExtensions.get(config.name)) !== null && _unionExtensions$get !== void 0 ? _unionExtensions$get : []; + const extensions = (_typeExtensionsMap$co5 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co5 !== void 0 ? _typeExtensionsMap$co5 : []; return new _definition.GraphQLUnionType({ ...config, types: () => [...type.getTypes().map(replaceNamedType), ...buildUnionTypes(extensions)], @@ -36092,8 +35312,10 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const opTypes = {}; for (const node of nodes) { var _node$operationTypes; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const operationTypesNodes = /* c8 ignore next */(_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; + const operationTypesNodes = /* c8 ignore next */ + (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; for (const operationType of operationTypesNodes) { // Note: While this could make early assertions to get the correctly // typed values below, that would throw immediately while type system @@ -36105,9 +35327,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { return opTypes; } function getNamedType(node) { - var _stdTypeMap$get2; + var _stdTypeMap$name2; const name = node.name.value; - const type = (_stdTypeMap$get2 = stdTypeMap.get(name)) !== null && _stdTypeMap$get2 !== void 0 ? _stdTypeMap$get2 : typeMap.get(name); + const type = (_stdTypeMap$name2 = stdTypeMap[name]) !== null && _stdTypeMap$name2 !== void 0 ? _stdTypeMap$name2 : typeMap[name]; if (type === undefined) { throw new Error(`Unknown type: "${name}".`); } @@ -36140,8 +35362,10 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const fieldConfigMap = Object.create(null); for (const node of nodes) { var _node$fields; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const nodeFields = /* c8 ignore next */(_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; + const nodeFields = /* c8 ignore next */ + (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; for (const field of nodeFields) { var _field$description; fieldConfigMap[field.name.value] = { @@ -36160,10 +35384,12 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } function buildArgumentMap(args) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const argsNodes = /* c8 ignore next */args !== null && args !== void 0 ? args : []; + const argsNodes = /* c8 ignore next */ + args !== null && args !== void 0 ? args : []; const argConfigMap = Object.create(null); for (const arg of argsNodes) { var _arg$description; + // Note: While this could make assertions to get the correctly typed // value, that would throw immediately while type system validation // with validateSchema() will produce more actionable results. @@ -36182,10 +35408,13 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const inputFieldMap = Object.create(null); for (const node of nodes) { var _node$fields2; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const fieldsNodes = /* c8 ignore next */(_node$fields2 = node.fields) !== null && _node$fields2 !== void 0 ? _node$fields2 : []; + const fieldsNodes = /* c8 ignore next */ + (_node$fields2 = node.fields) !== null && _node$fields2 !== void 0 ? _node$fields2 : []; for (const field of fieldsNodes) { var _field$description2; + // Note: While this could make assertions to get the correctly typed // value, that would throw immediately while type system validation // with validateSchema() will produce more actionable results. @@ -36205,8 +35434,10 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const enumValueMap = Object.create(null); for (const node of nodes) { var _node$values; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const valuesNodes = /* c8 ignore next */(_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; + const valuesNodes = /* c8 ignore next */ + (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; for (const value of valuesNodes) { var _value$description; enumValueMap[value.name.value] = { @@ -36227,7 +35458,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 node => { var _node$interfaces$map, _node$interfaces; - return /* c8 ignore next */(_node$interfaces$map = (_node$interfaces = node.interfaces) === null || _node$interfaces === void 0 ? void 0 : _node$interfaces.map(getNamedType)) !== null && _node$interfaces$map !== void 0 ? _node$interfaces$map : []; + return /* c8 ignore next */( + (_node$interfaces$map = (_node$interfaces = node.interfaces) === null || _node$interfaces === void 0 ? void 0 : _node$interfaces.map(getNamedType)) !== null && _node$interfaces$map !== void 0 ? _node$interfaces$map : [] + ); }); } function buildUnionTypes(nodes) { @@ -36239,16 +35472,19 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 node => { var _node$types$map, _node$types; - return /* c8 ignore next */(_node$types$map = (_node$types = node.types) === null || _node$types === void 0 ? void 0 : _node$types.map(getNamedType)) !== null && _node$types$map !== void 0 ? _node$types$map : []; + return /* c8 ignore next */( + (_node$types$map = (_node$types = node.types) === null || _node$types === void 0 ? void 0 : _node$types.map(getNamedType)) !== null && _node$types$map !== void 0 ? _node$types$map : [] + ); }); } function buildType(astNode) { + var _typeExtensionsMap$na; const name = astNode.name.value; + const extensionASTNodes = (_typeExtensionsMap$na = typeExtensionsMap[name]) !== null && _typeExtensionsMap$na !== void 0 ? _typeExtensionsMap$na : []; switch (astNode.kind) { case _kinds.Kind.OBJECT_TYPE_DEFINITION: { - var _objectExtensions$get2, _astNode$description; - const extensionASTNodes = (_objectExtensions$get2 = objectExtensions.get(name)) !== null && _objectExtensions$get2 !== void 0 ? _objectExtensions$get2 : []; + var _astNode$description; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLObjectType({ name, @@ -36261,8 +35497,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.INTERFACE_TYPE_DEFINITION: { - var _interfaceExtensions$2, _astNode$description2; - const extensionASTNodes = (_interfaceExtensions$2 = interfaceExtensions.get(name)) !== null && _interfaceExtensions$2 !== void 0 ? _interfaceExtensions$2 : []; + var _astNode$description2; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLInterfaceType({ name, @@ -36275,8 +35510,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.ENUM_TYPE_DEFINITION: { - var _enumExtensions$get2, _astNode$description3; - const extensionASTNodes = (_enumExtensions$get2 = enumExtensions.get(name)) !== null && _enumExtensions$get2 !== void 0 ? _enumExtensions$get2 : []; + var _astNode$description3; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLEnumType({ name, @@ -36288,8 +35522,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.UNION_TYPE_DEFINITION: { - var _unionExtensions$get2, _astNode$description4; - const extensionASTNodes = (_unionExtensions$get2 = unionExtensions.get(name)) !== null && _unionExtensions$get2 !== void 0 ? _unionExtensions$get2 : []; + var _astNode$description4; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLUnionType({ name, @@ -36301,8 +35534,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.SCALAR_TYPE_DEFINITION: { - var _scalarExtensions$get2, _astNode$description5; - const extensionASTNodes = (_scalarExtensions$get2 = scalarExtensions.get(name)) !== null && _scalarExtensions$get2 !== void 0 ? _scalarExtensions$get2 : []; + var _astNode$description5; return new _definition.GraphQLScalarType({ name, description: (_astNode$description5 = astNode.description) === null || _astNode$description5 === void 0 ? void 0 : _astNode$description5.value, @@ -36313,8 +35545,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION: { - var _inputObjectExtension2, _astNode$description6; - const extensionASTNodes = (_inputObjectExtension2 = inputObjectExtensions.get(name)) !== null && _inputObjectExtension2 !== void 0 ? _inputObjectExtension2 : []; + var _astNode$description6; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLInputObjectType({ name, @@ -36328,27 +35559,30 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } } } -const stdTypeMap = new Map([..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes].map(type => [type.name, type])); +const stdTypeMap = (0, _keyMap.keyMap)([..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes], type => type.name); /** * Given a field or enum value node, returns the string value for the * deprecation reason. */ + function getDeprecationReason(node) { - const deprecated = (0, _values.getDirectiveValues)(_directives.GraphQLDeprecatedDirective, node); - // @ts-expect-error validated by `getDirectiveValues` + const deprecated = (0, _values.getDirectiveValues)(_directives.GraphQLDeprecatedDirective, node); // @ts-expect-error validated by `getDirectiveValues` + return deprecated === null || deprecated === void 0 ? void 0 : deprecated.reason; } /** * Given a scalar node, returns the string value for the specifiedByURL. */ + function getSpecifiedByURL(node) { - const specifiedBy = (0, _values.getDirectiveValues)(_directives.GraphQLSpecifiedByDirective, node); - // @ts-expect-error validated by `getDirectiveValues` + const specifiedBy = (0, _values.getDirectiveValues)(_directives.GraphQLSpecifiedByDirective, node); // @ts-expect-error validated by `getDirectiveValues` + return specifiedBy === null || specifiedBy === void 0 ? void 0 : specifiedBy.url; } /** * Given an input object node, returns if the node should be OneOf. */ + function isOneOf(node) { return Boolean((0, _values.getDirectiveValues)(_directives.GraphQLOneOfDirective, node)); } @@ -36417,6 +35651,7 @@ function findBreakingChanges(oldSchema, newSchema) { * Given two schemas, returns an Array containing descriptions of all the types * of potentially dangerous changes covered by the other functions down below. */ + function findDangerousChanges(oldSchema, newSchema) { // @ts-expect-error return findSchemaChanges(oldSchema, newSchema).filter(change => change.type in DangerousChangeType); @@ -36685,8 +35920,8 @@ function isChangeSafeForInputObjectFieldOrFieldArg(oldType, newType) { // moving from non-null to nullable of the same underlying type is safe !(0, _definition.isNonNullType)(newType) && isChangeSafeForInputObjectFieldOrFieldArg(oldType.ofType, newType) ); - } - // if they're both named types, see if their names are equivalent + } // if they're both named types, see if their names are equivalent + return (0, _definition.isNamedType)(newType) && oldType.name === newType.name; } function typeKindName(type) { @@ -36710,6 +35945,7 @@ function typeKindName(type) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function stringifyValue(value, type) { @@ -36912,6 +36148,7 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * name. If a name is not provided, an operation is only returned if only one is * provided in the document. */ + function getOperationAST(documentAST, operationName) { let operation = null; for (const definition of documentAST.definitions) { @@ -36935,6 +36172,59 @@ function getOperationAST(documentAST, operationName) { /***/ }), +/***/ "../../../node_modules/graphql/utilities/getOperationRootType.mjs": +/*!************************************************************************!*\ + !*** ../../../node_modules/graphql/utilities/getOperationRootType.mjs ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.getOperationRootType = getOperationRootType; +var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +/** + * Extracts the root type of the operation from the schema. + * + * @deprecated Please use `GraphQLSchema.getRootType` instead. Will be removed in v17 + */ +function getOperationRootType(schema, operation) { + if (operation.operation === 'query') { + const queryType = schema.getQueryType(); + if (!queryType) { + throw new _GraphQLError.GraphQLError('Schema does not define the required query root type.', { + nodes: operation + }); + } + return queryType; + } + if (operation.operation === 'mutation') { + const mutationType = schema.getMutationType(); + if (!mutationType) { + throw new _GraphQLError.GraphQLError('Schema is not configured for mutations.', { + nodes: operation + }); + } + return mutationType; + } + if (operation.operation === 'subscription') { + const subscriptionType = schema.getSubscriptionType(); + if (!subscriptionType) { + throw new _GraphQLError.GraphQLError('Schema is not configured for subscriptions.', { + nodes: operation + }); + } + return subscriptionType; + } + throw new _GraphQLError.GraphQLError('Can only have query, mutation and subscription operations.', { + nodes: operation + }); +} + +/***/ }), + /***/ "../../../node_modules/graphql/utilities/index.mjs": /*!*********************************************************!*\ !*** ../../../node_modules/graphql/utilities/index.mjs ***! @@ -36964,6 +36254,12 @@ Object.defineProperty(exports, "TypeInfo", ({ return _TypeInfo.TypeInfo; } })); +Object.defineProperty(exports, "assertValidName", ({ + enumerable: true, + get: function () { + return _assertValidName.assertValidName; + } +})); Object.defineProperty(exports, "astFromValue", ({ enumerable: true, get: function () { @@ -37036,6 +36332,12 @@ Object.defineProperty(exports, "getOperationAST", ({ return _getOperationAST.getOperationAST; } })); +Object.defineProperty(exports, "getOperationRootType", ({ + enumerable: true, + get: function () { + return _getOperationRootType.getOperationRootType; + } +})); Object.defineProperty(exports, "introspectionFromSchema", ({ enumerable: true, get: function () { @@ -37054,18 +36356,18 @@ Object.defineProperty(exports, "isTypeSubTypeOf", ({ return _typeComparators.isTypeSubTypeOf; } })); +Object.defineProperty(exports, "isValidNameError", ({ + enumerable: true, + get: function () { + return _assertValidName.isValidNameError; + } +})); Object.defineProperty(exports, "lexicographicSortSchema", ({ enumerable: true, get: function () { return _lexicographicSortSchema.lexicographicSortSchema; } })); -Object.defineProperty(exports, "printDirective", ({ - enumerable: true, - get: function () { - return _printSchema.printDirective; - } -})); Object.defineProperty(exports, "printIntrospectionSchema", ({ enumerable: true, get: function () { @@ -37122,6 +36424,7 @@ Object.defineProperty(exports, "visitWithTypeInfo", ({ })); var _getIntrospectionQuery = __webpack_require__(/*! ./getIntrospectionQuery.mjs */ "../../../node_modules/graphql/utilities/getIntrospectionQuery.mjs"); var _getOperationAST = __webpack_require__(/*! ./getOperationAST.mjs */ "../../../node_modules/graphql/utilities/getOperationAST.mjs"); +var _getOperationRootType = __webpack_require__(/*! ./getOperationRootType.mjs */ "../../../node_modules/graphql/utilities/getOperationRootType.mjs"); var _introspectionFromSchema = __webpack_require__(/*! ./introspectionFromSchema.mjs */ "../../../node_modules/graphql/utilities/introspectionFromSchema.mjs"); var _buildClientSchema = __webpack_require__(/*! ./buildClientSchema.mjs */ "../../../node_modules/graphql/utilities/buildClientSchema.mjs"); var _buildASTSchema = __webpack_require__(/*! ./buildASTSchema.mjs */ "../../../node_modules/graphql/utilities/buildASTSchema.mjs"); @@ -37138,6 +36441,7 @@ var _concatAST = __webpack_require__(/*! ./concatAST.mjs */ "../../../node_modul var _separateOperations = __webpack_require__(/*! ./separateOperations.mjs */ "../../../node_modules/graphql/utilities/separateOperations.mjs"); var _stripIgnoredCharacters = __webpack_require__(/*! ./stripIgnoredCharacters.mjs */ "../../../node_modules/graphql/utilities/stripIgnoredCharacters.mjs"); var _typeComparators = __webpack_require__(/*! ./typeComparators.mjs */ "../../../node_modules/graphql/utilities/typeComparators.mjs"); +var _assertValidName = __webpack_require__(/*! ./assertValidName.mjs */ "../../../node_modules/graphql/utilities/assertValidName.mjs"); var _findBreakingChanges = __webpack_require__(/*! ./findBreakingChanges.mjs */ "../../../node_modules/graphql/utilities/findBreakingChanges.mjs"); /***/ }), @@ -37167,6 +36471,7 @@ var _getIntrospectionQuery = __webpack_require__(/*! ./getIntrospectionQuery.mjs * This is the inverse of buildClientSchema. The primary use case is outside * of the server context, for instance when doing schema comparisons. */ + function introspectionFromSchema(schema, options) { const optionsWithDefaults = { specifiedByUrl: true, @@ -37181,7 +36486,7 @@ function introspectionFromSchema(schema, options) { schema, document }); - result.errors == null && result.data != null || (0, _invariant.invariant)(false); + !result.errors && result.data || (0, _invariant.invariant)(false); return result.data; } @@ -37201,6 +36506,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.lexicographicSortSchema = lexicographicSortSchema; var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +var _keyValMap = __webpack_require__(/*! ../jsutils/keyValMap.mjs */ "../../../node_modules/graphql/jsutils/keyValMap.mjs"); var _naturalCompare = __webpack_require__(/*! ../jsutils/naturalCompare.mjs */ "../../../node_modules/graphql/jsutils/naturalCompare.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); @@ -37211,12 +36517,13 @@ var _schema = __webpack_require__(/*! ../type/schema.mjs */ "../../../node_modul * * This function returns a sorted copy of the given GraphQLSchema. */ + function lexicographicSortSchema(schema) { const schemaConfig = schema.toConfig(); - const typeMap = new Map(sortByName(schemaConfig.types).map(type => [type.name, sortNamedType(type)])); + const typeMap = (0, _keyValMap.keyValMap)(sortByName(schemaConfig.types), type => type.name, sortNamedType); return new _schema.GraphQLSchema({ ...schemaConfig, - types: Array.from(typeMap.values()), + types: Object.values(typeMap), directives: sortByName(schemaConfig.directives).map(sortDirective), query: replaceMaybeType(schemaConfig.query), mutation: replaceMaybeType(schemaConfig.mutation), @@ -37229,12 +36536,12 @@ function lexicographicSortSchema(schema) { } else if ((0, _definition.isNonNullType)(type)) { // @ts-expect-error return new _definition.GraphQLNonNull(replaceType(type.ofType)); - } - // @ts-expect-error FIXME: TS Conversion + } // @ts-expect-error FIXME: TS Conversion + return replaceNamedType(type); } function replaceNamedType(type) { - return typeMap.get(type.name); + return typeMap[type.name]; } function replaceMaybeType(maybeType) { return maybeType && replaceNamedType(maybeType); @@ -37312,6 +36619,7 @@ function lexicographicSortSchema(schema) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } } @@ -37346,7 +36654,6 @@ function sortBy(array, mapToKey) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.printDirective = printDirective; exports.printIntrospectionSchema = printIntrospectionSchema; exports.printSchema = printSchema; exports.printType = printType; @@ -37375,19 +36682,23 @@ function printFilteredSchema(schema, directiveFilter, typeFilter) { return [printSchemaDefinition(schema), ...directives.map(directive => printDirective(directive)), ...types.map(type => printType(type))].filter(Boolean).join('\n\n'); } function printSchemaDefinition(schema) { - const queryType = schema.getQueryType(); - const mutationType = schema.getMutationType(); - const subscriptionType = schema.getSubscriptionType(); - // Special case: When a schema has no root operation types, no valid schema - // definition can be printed. - if (!queryType && !mutationType && !subscriptionType) { + if (schema.description == null && isSchemaOfCommonNames(schema)) { return; } - // Only print a schema definition if there is a description or if it should - // not be omitted because of having default type names. - if (schema.description != null || !hasDefaultRootOperationTypes(schema)) { - return printDescription(schema) + 'schema {\n' + (queryType ? ` query: ${queryType.name}\n` : '') + (mutationType ? ` mutation: ${mutationType.name}\n` : '') + (subscriptionType ? ` subscription: ${subscriptionType.name}\n` : '') + '}'; + const operationTypes = []; + const queryType = schema.getQueryType(); + if (queryType) { + operationTypes.push(` query: ${queryType.name}`); } + const mutationType = schema.getMutationType(); + if (mutationType) { + operationTypes.push(` mutation: ${mutationType.name}`); + } + const subscriptionType = schema.getSubscriptionType(); + if (subscriptionType) { + operationTypes.push(` subscription: ${subscriptionType.name}`); + } + return printDescription(schema) + `schema {\n${operationTypes.join('\n')}\n}`; } /** * GraphQL schema define root types for each type of operation. These types are @@ -37402,16 +36713,23 @@ function printSchemaDefinition(schema) { * } * ``` * - * When using this naming convention, the schema description can be omitted so - * long as these names are only used for operation types. - * - * Note however that if any of these default names are used elsewhere in the - * schema but not as a root operation type, the schema definition must still - * be printed to avoid ambiguity. + * When using this naming convention, the schema description can be omitted. */ -function hasDefaultRootOperationTypes(schema) { - /* eslint-disable eqeqeq */ - return schema.getQueryType() == schema.getType('Query') && schema.getMutationType() == schema.getType('Mutation') && schema.getSubscriptionType() == schema.getType('Subscription'); + +function isSchemaOfCommonNames(schema) { + const queryType = schema.getQueryType(); + if (queryType && queryType.name !== 'Query') { + return false; + } + const mutationType = schema.getMutationType(); + if (mutationType && mutationType.name !== 'Mutation') { + return false; + } + const subscriptionType = schema.getSubscriptionType(); + if (subscriptionType && subscriptionType.name !== 'Subscription') { + return false; + } + return true; } function printType(type) { if ((0, _definition.isScalarType)(type)) { @@ -37434,6 +36752,7 @@ function printType(type) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function printScalar(type) { @@ -37472,9 +36791,9 @@ function printBlock(items) { function printArgs(args, indentation = '') { if (args.length === 0) { return ''; - } - // If every arg does not have a description, print them on one line. - if (args.every(arg => arg.description == null)) { + } // If every arg does not have a description, print them on one line. + + if (args.every(arg => !arg.description)) { return '(' + args.map(printInputValue).join(', ') + ')'; } return '(\n' + args.map((arg, i) => printDescription(arg, ' ' + indentation, !i) + ' ' + indentation + printInputValue(arg)).join('\n') + '\n' + indentation + ')'; @@ -37526,7 +36845,7 @@ function printDescription(def, indentation = '', firstInBlock = true) { block: (0, _blockString.isPrintableAsBlockString)(description) }); const prefix = indentation && !firstInBlock ? '\n' + indentation : indentation; - return prefix + blockString.replaceAll('\n', '\n' + indentation) + '\n'; + return prefix + blockString.replace(/\n/g, '\n' + indentation) + '\n'; } /***/ }), @@ -37551,10 +36870,11 @@ var _visitor = __webpack_require__(/*! ../language/visitor.mjs */ "../../../node * which contains a single operation as well the fragment definitions it * refers to. */ + function separateOperations(documentAST) { const operations = []; - const depGraph = Object.create(null); - // Populate metadata and build a dependency graph. + const depGraph = Object.create(null); // Populate metadata and build a dependency graph. + for (const definitionNode of documentAST.definitions) { switch (definitionNode.kind) { case _kinds.Kind.OPERATION_DEFINITION: @@ -37563,22 +36883,21 @@ function separateOperations(documentAST) { case _kinds.Kind.FRAGMENT_DEFINITION: depGraph[definitionNode.name.value] = collectDependencies(definitionNode.selectionSet); break; - default: - // ignore non-executable definitions + default: // ignore non-executable definitions } - } - // For each operation, produce a new synthesized AST which includes only what + } // For each operation, produce a new synthesized AST which includes only what // is necessary for completing that operation. + const separatedDocumentASTs = Object.create(null); for (const operation of operations) { const dependencies = new Set(); for (const fragmentName of collectDependencies(operation.selectionSet)) { collectTransitiveDependencies(dependencies, depGraph, fragmentName); - } - // Provides the empty string for anonymous operations. - const operationName = operation.name ? operation.name.value : ''; - // The list of definition nodes to be included for this operation, sorted + } // Provides the empty string for anonymous operations. + + const operationName = operation.name ? operation.name.value : ''; // The list of definition nodes to be included for this operation, sorted // to retain the same order as the original document. + separatedDocumentASTs[operationName] = { kind: _kinds.Kind.DOCUMENT, definitions: documentAST.definitions.filter(node => node === operation || node.kind === _kinds.Kind.FRAGMENT_DEFINITION && dependencies.has(node.name.value)) @@ -37586,6 +36905,7 @@ function separateOperations(documentAST) { } return separatedDocumentASTs; } + // From a dependency graph, collects a list of transitive dependencies by // recursing through a dependency graph. function collectTransitiveDependencies(collected, depGraph, fromName) { @@ -37632,6 +36952,7 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * * @internal */ + function sortValueNode(valueNode) { switch (valueNode.kind) { case _kinds.Kind.OBJECT: @@ -37739,6 +37060,7 @@ var _tokenKind = __webpack_require__(/*! ../language/tokenKind.mjs */ "../../../ * """Type description""" type Foo{"""Field description""" bar:String} * ``` */ + function stripIgnoredCharacters(source) { const sourceObj = (0, _source.isSource)(source) ? source : new _source.Source(source); const body = sourceObj.body; @@ -37753,6 +37075,7 @@ function stripIgnoredCharacters(source) { * Also prevent case of non-punctuator token following by spread resulting * in invalid token (e.g. `1...` is invalid Float token). */ + const isNonPunctuator = !(0, _lexer.isPunctuatorTokenKind)(currentToken.kind); if (wasLastAddedTokenNonPunctuator) { if (isNonPunctuator || currentToken.kind === _tokenKind.TokenKind.SPREAD) { @@ -37796,28 +37119,29 @@ function isEqualType(typeA, typeB) { // Equivalent types are equal. if (typeA === typeB) { return true; - } - // If either type is non-null, the other must also be non-null. + } // If either type is non-null, the other must also be non-null. + if ((0, _definition.isNonNullType)(typeA) && (0, _definition.isNonNullType)(typeB)) { return isEqualType(typeA.ofType, typeB.ofType); - } - // If either type is a list, the other must also be a list. + } // If either type is a list, the other must also be a list. + if ((0, _definition.isListType)(typeA) && (0, _definition.isListType)(typeB)) { return isEqualType(typeA.ofType, typeB.ofType); - } - // Otherwise the types are not equal. + } // Otherwise the types are not equal. + return false; } /** * Provided a type and a super type, return true if the first type is either * equal or a subset of the second super type (covariant). */ + function isTypeSubTypeOf(schema, maybeSubType, superType) { // Equivalent type is a valid subtype if (maybeSubType === superType) { return true; - } - // If superType is non-null, maybeSubType must also be non-null. + } // If superType is non-null, maybeSubType must also be non-null. + if ((0, _definition.isNonNullType)(superType)) { if ((0, _definition.isNonNullType)(maybeSubType)) { return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType); @@ -37827,8 +37151,8 @@ function isTypeSubTypeOf(schema, maybeSubType, superType) { if ((0, _definition.isNonNullType)(maybeSubType)) { // If superType is nullable, maybeSubType may be non-null or nullable. return isTypeSubTypeOf(schema, maybeSubType.ofType, superType); - } - // If superType type is a list, maybeSubType type must also be a list. + } // If superType type is a list, maybeSubType type must also be a list. + if ((0, _definition.isListType)(superType)) { if ((0, _definition.isListType)(maybeSubType)) { return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType); @@ -37838,9 +37162,9 @@ function isTypeSubTypeOf(schema, maybeSubType, superType) { if ((0, _definition.isListType)(maybeSubType)) { // If superType is not a list, maybeSubType must also be not a list. return false; - } - // If superType type is an abstract type, check if it is super type of maybeSubType. + } // If superType type is an abstract type, check if it is super type of maybeSubType. // Otherwise, the child type is not a valid subtype of the parent type. + return (0, _definition.isAbstractType)(superType) && ((0, _definition.isInterfaceType)(maybeSubType) || (0, _definition.isObjectType)(maybeSubType)) && schema.isSubType(superType, maybeSubType); } /** @@ -37852,6 +37176,7 @@ function isTypeSubTypeOf(schema, maybeSubType, superType) { * * This function is commutative. */ + function doTypesOverlap(schema, typeA, typeB) { // Equivalent types overlap if (typeA === typeB) { @@ -37862,15 +37187,15 @@ function doTypesOverlap(schema, typeA, typeB) { // If both types are abstract, then determine if there is any intersection // between possible concrete types of each. return schema.getPossibleTypes(typeA).some(type => schema.isSubType(typeB, type)); - } - // Determine if the latter type is a possible concrete type of the former. + } // Determine if the latter type is a possible concrete type of the former. + return schema.isSubType(typeA, typeB); } if ((0, _definition.isAbstractType)(typeB)) { // Determine if the former type is a possible concrete type of the latter. return schema.isSubType(typeB, typeA); - } - // Otherwise the types do not overlap. + } // Otherwise the types do not overlap. + return false; } @@ -37923,6 +37248,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.valueFromAST = valueFromAST; var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); /** @@ -37945,6 +37271,7 @@ var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../no * | NullValue | null | * */ + function valueFromAST(valueNode, type, variables) { if (!valueNode) { // When there is no node, then there is also no value. @@ -37960,10 +37287,10 @@ function valueFromAST(valueNode, type, variables) { const variableValue = variables[variableName]; if (variableValue === null && (0, _definition.isNonNullType)(type)) { return; // Invalid: intentionally return no value. - } - // Note: This does no further checking that this variable is correct. + } // Note: This does no further checking that this variable is correct. // This assumes that this query has been validated and the variable // usage here is of the correct type. + return variableValue; } if ((0, _definition.isNonNullType)(type)) { @@ -38009,10 +37336,10 @@ function valueFromAST(valueNode, type, variables) { return; // Invalid: intentionally return no value. } const coercedObj = Object.create(null); - const fieldNodes = new Map(valueNode.fields.map(field => [field.name.value, field])); + const fieldNodes = (0, _keyMap.keyMap)(valueNode.fields, field => field.name.value); for (const field of Object.values(type.getFields())) { - const fieldNode = fieldNodes.get(field.name); - if (fieldNode == null || isMissingVariable(fieldNode.value, variables)) { + const fieldNode = fieldNodes[field.name]; + if (!fieldNode || isMissingVariable(fieldNode.value, variables)) { if (field.defaultValue !== undefined) { coercedObj[field.name] = field.defaultValue; } else if ((0, _definition.isNonNullType)(field.type)) { @@ -38054,10 +37381,11 @@ function valueFromAST(valueNode, type, variables) { } /* c8 ignore next 3 */ // Not reachable, all possible input types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected input type: ' + (0, _inspect.inspect)(type)); -} -// Returns true if the provided valueNode is a variable which is not defined +} // Returns true if the provided valueNode is a variable which is not defined // in the set of variables. + function isMissingVariable(valueNode, variables) { return valueNode.kind === _kinds.Kind.VARIABLE && (variables == null || variables[valueNode.name.value] === undefined); } @@ -38094,6 +37422,7 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * | Null | null | * */ + function valueFromASTUntyped(valueNode, variables) { switch (valueNode.kind) { case _kinds.Kind.NULL: @@ -38192,14 +37521,14 @@ class ASTValidationContext { let fragments = this._recursivelyReferencedFragments.get(operation); if (!fragments) { fragments = []; - const collectedNames = new Set(); + const collectedNames = Object.create(null); const nodesToVisit = [operation.selectionSet]; let node; while (node = nodesToVisit.pop()) { for (const spread of this.getFragmentSpreads(node)) { const fragName = spread.name.value; - if (!collectedNames.has(fragName)) { - collectedNames.add(fragName); + if (collectedNames[fragName] !== true) { + collectedNames[fragName] = true; const fragment = this.getFragment(fragName); if (fragment) { fragments.push(fragment); @@ -38312,24 +37641,6 @@ exports.ValidationContext = ValidationContext; Object.defineProperty(exports, "__esModule", ({ value: true })); -Object.defineProperty(exports, "DeferStreamDirectiveLabelRule", ({ - enumerable: true, - get: function () { - return _DeferStreamDirectiveLabelRule.DeferStreamDirectiveLabelRule; - } -})); -Object.defineProperty(exports, "DeferStreamDirectiveOnRootFieldRule", ({ - enumerable: true, - get: function () { - return _DeferStreamDirectiveOnRootFieldRule.DeferStreamDirectiveOnRootFieldRule; - } -})); -Object.defineProperty(exports, "DeferStreamDirectiveOnValidOperationsRule", ({ - enumerable: true, - get: function () { - return _DeferStreamDirectiveOnValidOperationsRule.DeferStreamDirectiveOnValidOperationsRule; - } -})); Object.defineProperty(exports, "ExecutableDefinitionsRule", ({ enumerable: true, get: function () { @@ -38462,12 +37773,6 @@ Object.defineProperty(exports, "SingleFieldSubscriptionsRule", ({ return _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule; } })); -Object.defineProperty(exports, "StreamDirectiveOnListFieldRule", ({ - enumerable: true, - get: function () { - return _StreamDirectiveOnListFieldRule.StreamDirectiveOnListFieldRule; - } -})); Object.defineProperty(exports, "UniqueArgumentDefinitionNamesRule", ({ enumerable: true, get: function () { @@ -38585,9 +37890,6 @@ Object.defineProperty(exports, "validate", ({ var _validate = __webpack_require__(/*! ./validate.mjs */ "../../../node_modules/graphql/validation/validate.mjs"); var _ValidationContext = __webpack_require__(/*! ./ValidationContext.mjs */ "../../../node_modules/graphql/validation/ValidationContext.mjs"); var _specifiedRules = __webpack_require__(/*! ./specifiedRules.mjs */ "../../../node_modules/graphql/validation/specifiedRules.mjs"); -var _DeferStreamDirectiveLabelRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveLabelRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs"); -var _DeferStreamDirectiveOnRootFieldRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnRootFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs"); -var _DeferStreamDirectiveOnValidOperationsRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnValidOperationsRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs"); var _ExecutableDefinitionsRule = __webpack_require__(/*! ./rules/ExecutableDefinitionsRule.mjs */ "../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs"); var _FieldsOnCorrectTypeRule = __webpack_require__(/*! ./rules/FieldsOnCorrectTypeRule.mjs */ "../../../node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.mjs"); var _FragmentsOnCompositeTypesRule = __webpack_require__(/*! ./rules/FragmentsOnCompositeTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.mjs"); @@ -38605,7 +37907,6 @@ var _PossibleFragmentSpreadsRule = __webpack_require__(/*! ./rules/PossibleFragm var _ProvidedRequiredArgumentsRule = __webpack_require__(/*! ./rules/ProvidedRequiredArgumentsRule.mjs */ "../../../node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.mjs"); var _ScalarLeafsRule = __webpack_require__(/*! ./rules/ScalarLeafsRule.mjs */ "../../../node_modules/graphql/validation/rules/ScalarLeafsRule.mjs"); var _SingleFieldSubscriptionsRule = __webpack_require__(/*! ./rules/SingleFieldSubscriptionsRule.mjs */ "../../../node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.mjs"); -var _StreamDirectiveOnListFieldRule = __webpack_require__(/*! ./rules/StreamDirectiveOnListFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs"); var _UniqueArgumentNamesRule = __webpack_require__(/*! ./rules/UniqueArgumentNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueArgumentNamesRule.mjs"); var _UniqueDirectivesPerLocationRule = __webpack_require__(/*! ./rules/UniqueDirectivesPerLocationRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.mjs"); var _UniqueFragmentNamesRule = __webpack_require__(/*! ./rules/UniqueFragmentNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueFragmentNamesRule.mjs"); @@ -38629,182 +37930,6 @@ var _NoSchemaIntrospectionCustomRule = __webpack_require__(/*! ./rules/custom/No /***/ }), -/***/ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs": -/*!****************************************************************************************!*\ - !*** ../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs ***! - \****************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.DeferStreamDirectiveLabelRule = DeferStreamDirectiveLabelRule; -var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); -var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); -/** - * Defer and stream directive labels are unique - * - * A GraphQL document is only valid if defer and stream directives' label argument is static and unique. - */ -function DeferStreamDirectiveLabelRule(context) { - const knownLabels = new Map(); - return { - Directive(node) { - if (node.name.value === _directives.GraphQLDeferDirective.name || node.name.value === _directives.GraphQLStreamDirective.name) { - var _node$arguments; - const labelArgument = (_node$arguments = node.arguments) === null || _node$arguments === void 0 ? void 0 : _node$arguments.find(arg => arg.name.value === 'label'); - const labelValue = labelArgument === null || labelArgument === void 0 ? void 0 : labelArgument.value; - if (!labelValue) { - return; - } - if (labelValue.kind !== _kinds.Kind.STRING) { - context.reportError(new _GraphQLError.GraphQLError(`Directive "${node.name.value}"'s label argument must be a static string.`, { - nodes: node - })); - return; - } - const knownLabel = knownLabels.get(labelValue.value); - if (knownLabel != null) { - context.reportError(new _GraphQLError.GraphQLError('Defer/Stream directive label argument must be unique.', { - nodes: [knownLabel, node] - })); - } else { - knownLabels.set(labelValue.value, node); - } - } - } - }; -} - -/***/ }), - -/***/ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs": -/*!**********************************************************************************************!*\ - !*** ../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs ***! - \**********************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.DeferStreamDirectiveOnRootFieldRule = DeferStreamDirectiveOnRootFieldRule; -var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); -/** - * Defer and stream directives are used on valid root field - * - * A GraphQL document is only valid if defer directives are not used on root mutation or subscription types. - */ -function DeferStreamDirectiveOnRootFieldRule(context) { - return { - Directive(node) { - const mutationType = context.getSchema().getMutationType(); - const subscriptionType = context.getSchema().getSubscriptionType(); - const parentType = context.getParentType(); - if (parentType && node.name.value === _directives.GraphQLDeferDirective.name) { - if (mutationType && parentType === mutationType) { - context.reportError(new _GraphQLError.GraphQLError(`Defer directive cannot be used on root mutation type "${parentType.name}".`, { - nodes: node - })); - } - if (subscriptionType && parentType === subscriptionType) { - context.reportError(new _GraphQLError.GraphQLError(`Defer directive cannot be used on root subscription type "${parentType.name}".`, { - nodes: node - })); - } - } - if (parentType && node.name.value === _directives.GraphQLStreamDirective.name) { - if (mutationType && parentType === mutationType) { - context.reportError(new _GraphQLError.GraphQLError(`Stream directive cannot be used on root mutation type "${parentType.name}".`, { - nodes: node - })); - } - if (subscriptionType && parentType === subscriptionType) { - context.reportError(new _GraphQLError.GraphQLError(`Stream directive cannot be used on root subscription type "${parentType.name}".`, { - nodes: node - })); - } - } - } - }; -} - -/***/ }), - -/***/ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs": -/*!****************************************************************************************************!*\ - !*** ../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs ***! - \****************************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.DeferStreamDirectiveOnValidOperationsRule = DeferStreamDirectiveOnValidOperationsRule; -var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _ast = __webpack_require__(/*! ../../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); -var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); -var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); -function ifArgumentCanBeFalse(node) { - var _node$arguments; - const ifArgument = (_node$arguments = node.arguments) === null || _node$arguments === void 0 ? void 0 : _node$arguments.find(arg => arg.name.value === 'if'); - if (!ifArgument) { - return false; - } - if (ifArgument.value.kind === _kinds.Kind.BOOLEAN) { - if (ifArgument.value.value) { - return false; - } - } else if (ifArgument.value.kind !== _kinds.Kind.VARIABLE) { - return false; - } - return true; -} -/** - * Defer And Stream Directives Are Used On Valid Operations - * - * A GraphQL document is only valid if defer directives are not used on root mutation or subscription types. - */ -function DeferStreamDirectiveOnValidOperationsRule(context) { - const fragmentsUsedOnSubscriptions = new Set(); - return { - OperationDefinition(operation) { - if (operation.operation === _ast.OperationTypeNode.SUBSCRIPTION) { - for (const fragment of context.getRecursivelyReferencedFragments(operation)) { - fragmentsUsedOnSubscriptions.add(fragment.name.value); - } - } - }, - Directive(node, _key, _parent, _path, ancestors) { - const definitionNode = ancestors[2]; - if ('kind' in definitionNode && (definitionNode.kind === _kinds.Kind.FRAGMENT_DEFINITION && fragmentsUsedOnSubscriptions.has(definitionNode.name.value) || definitionNode.kind === _kinds.Kind.OPERATION_DEFINITION && definitionNode.operation === _ast.OperationTypeNode.SUBSCRIPTION)) { - if (node.name.value === _directives.GraphQLDeferDirective.name) { - if (!ifArgumentCanBeFalse(node)) { - context.reportError(new _GraphQLError.GraphQLError('Defer directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`.', { - nodes: node - })); - } - } else if (node.name.value === _directives.GraphQLStreamDirective.name) { - if (!ifArgumentCanBeFalse(node)) { - context.reportError(new _GraphQLError.GraphQLError('Stream directive not supported on subscription operations. Disable `@stream` by setting the `if` argument to `false`.', { - nodes: node - })); - } - } - } - } - }; -} - -/***/ }), - /***/ "../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs": /*!************************************************************************************!*\ !*** ../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs ***! @@ -38880,14 +38005,14 @@ function FieldsOnCorrectTypeRule(context) { if (!fieldDef) { // This field doesn't exist, lets look for suggestions. const schema = context.getSchema(); - const fieldName = node.name.value; - // First determine if there are any suggested types to condition on. - let suggestion = (0, _didYouMean.didYouMean)('to use an inline fragment on', getSuggestedTypeNames(schema, type, fieldName)); - // If there are no suggested types, then perhaps this was a typo? + const fieldName = node.name.value; // First determine if there are any suggested types to condition on. + + let suggestion = (0, _didYouMean.didYouMean)('to use an inline fragment on', getSuggestedTypeNames(schema, type, fieldName)); // If there are no suggested types, then perhaps this was a typo? + if (suggestion === '') { suggestion = (0, _didYouMean.didYouMean)(getSuggestedFieldNames(type, fieldName)); - } - // Report an error, including helpful suggestions. + } // Report an error, including helpful suggestions. + context.reportError(new _GraphQLError.GraphQLError(`Cannot query field "${fieldName}" on type "${type.name}".` + suggestion, { nodes: node })); @@ -38901,6 +38026,7 @@ function FieldsOnCorrectTypeRule(context) { * they implement. If any of those types include the provided field, suggest them, * sorted by how often the type is referenced. */ + function getSuggestedTypeNames(schema, type, fieldName) { if (!(0, _definition.isAbstractType)(type)) { // Must be an Object type, which does not have possible fields. @@ -38909,18 +38035,18 @@ function getSuggestedTypeNames(schema, type, fieldName) { const suggestedTypes = new Set(); const usageCount = Object.create(null); for (const possibleType of schema.getPossibleTypes(type)) { - if (possibleType.getFields()[fieldName] == null) { + if (!possibleType.getFields()[fieldName]) { continue; - } - // This object type defines this field. + } // This object type defines this field. + suggestedTypes.add(possibleType); usageCount[possibleType.name] = 1; for (const possibleInterface of possibleType.getInterfaces()) { var _usageCount$possibleI; - if (possibleInterface.getFields()[fieldName] == null) { + if (!possibleInterface.getFields()[fieldName]) { continue; - } - // This interface type defines this field. + } // This interface type defines this field. + suggestedTypes.add(possibleInterface); usageCount[possibleInterface.name] = ((_usageCount$possibleI = usageCount[possibleInterface.name]) !== null && _usageCount$possibleI !== void 0 ? _usageCount$possibleI : 0) + 1; } @@ -38930,8 +38056,8 @@ function getSuggestedTypeNames(schema, type, fieldName) { const usageCountDiff = usageCount[typeB.name] - usageCount[typeA.name]; if (usageCountDiff !== 0) { return usageCountDiff; - } - // Suggest super types first followed by subtypes + } // Suggest super types first followed by subtypes + if ((0, _definition.isInterfaceType)(typeA) && schema.isSubType(typeA, typeB)) { return -1; } @@ -38945,12 +38071,13 @@ function getSuggestedTypeNames(schema, type, fieldName) { * For the field name provided, determine if there are any similar field names * that may be the result of a typo. */ + function getSuggestedFieldNames(type, fieldName) { if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type)) { const possibleFieldNames = Object.keys(type.getFields()); return (0, _suggestionList.suggestionList)(fieldName, possibleFieldNames); - } - // Otherwise, must be a Union type, which does not define fields. + } // Otherwise, must be a Union type, which does not define fields. + return []; } @@ -39058,28 +38185,31 @@ function KnownArgumentNamesRule(context) { /** * @internal */ + function KnownArgumentNamesOnDirectivesRule(context) { - const directiveArgs = new Map(); + const directiveArgs = Object.create(null); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives; for (const directive of definedDirectives) { - directiveArgs.set(directive.name, directive.args.map(arg => arg.name)); + directiveArgs[directive.name] = directive.args.map(arg => arg.name); } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { var _def$arguments; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argsNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : []; - directiveArgs.set(def.name.value, argsNodes.map(arg => arg.name.value)); + directiveArgs[def.name.value] = argsNodes.map(arg => arg.name.value); } } return { Directive(directiveNode) { const directiveName = directiveNode.name.value; - const knownArgs = directiveArgs.get(directiveName); - if (directiveNode.arguments != null && knownArgs != null) { + const knownArgs = directiveArgs[directiveName]; + if (directiveNode.arguments && knownArgs) { for (const argNode of directiveNode.arguments) { const argName = argNode.name.value; if (!knownArgs.includes(argName)) { @@ -39125,30 +38255,30 @@ var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../.. * See https://spec.graphql.org/draft/#sec-Directives-Are-Defined */ function KnownDirectivesRule(context) { - const locationsMap = new Map(); + const locationsMap = Object.create(null); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives; for (const directive of definedDirectives) { - locationsMap.set(directive.name, directive.locations); + locationsMap[directive.name] = directive.locations; } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { - locationsMap.set(def.name.value, def.locations.map(name => name.value)); + locationsMap[def.name.value] = def.locations.map(name => name.value); } } return { Directive(node, _key, _parent, _path, ancestors) { const name = node.name.value; - const locations = locationsMap.get(name); - if (locations == null) { + const locations = locationsMap[name]; + if (!locations) { context.reportError(new _GraphQLError.GraphQLError(`Unknown directive "@${name}".`, { nodes: node })); return; } const candidateLocation = getDirectiveLocationForASTPath(ancestors); - if (candidateLocation != null && !locations.includes(candidateLocation)) { + if (candidateLocation && !locations.includes(candidateLocation)) { context.reportError(new _GraphQLError.GraphQLError(`Directive "@${name}" may not be used on ${candidateLocation}.`, { nodes: node })); @@ -39157,8 +38287,8 @@ function KnownDirectivesRule(context) { }; } function getDirectiveLocationForASTPath(ancestors) { - const appliedTo = ancestors.at(-1); - appliedTo != null && 'kind' in appliedTo || (0, _invariant.invariant)(false); + const appliedTo = ancestors[ancestors.length - 1]; + 'kind' in appliedTo || (0, _invariant.invariant)(false); switch (appliedTo.kind) { case _kinds.Kind.OPERATION_DEFINITION: return getDirectiveLocationForOperation(appliedTo.operation); @@ -39199,12 +38329,14 @@ function getDirectiveLocationForASTPath(ancestors) { return _directiveLocation.DirectiveLocation.INPUT_OBJECT; case _kinds.Kind.INPUT_VALUE_DEFINITION: { - const parentNode = ancestors.at(-3); - parentNode != null && 'kind' in parentNode || (0, _invariant.invariant)(false); + const parentNode = ancestors[ancestors.length - 3]; + 'kind' in parentNode || (0, _invariant.invariant)(false); return parentNode.kind === _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION ? _directiveLocation.DirectiveLocation.INPUT_FIELD_DEFINITION : _directiveLocation.DirectiveLocation.ARGUMENT_DEFINITION; } // Not reachable, all possible types have been considered. - /* c8 ignore next 2 */ + + /* c8 ignore next */ + default: false || (0, _invariant.invariant)(false, 'Unexpected kind: ' + (0, _inspect.inspect)(appliedTo.kind)); } @@ -39286,23 +38418,26 @@ var _scalars = __webpack_require__(/*! ../../type/scalars.mjs */ "../../../node_ * See https://spec.graphql.org/draft/#sec-Fragment-Spread-Type-Existence */ function KnownTypeNamesRule(context) { - var _context$getSchema$ge, _context$getSchema; - const { - definitions - } = context.getDocument(); - const existingTypesMap = (_context$getSchema$ge = (_context$getSchema = context.getSchema()) === null || _context$getSchema === void 0 ? void 0 : _context$getSchema.getTypeMap()) !== null && _context$getSchema$ge !== void 0 ? _context$getSchema$ge : {}; - const typeNames = new Set([...Object.keys(existingTypesMap), ...definitions.filter(_predicates.isTypeDefinitionNode).map(def => def.name.value)]); + const schema = context.getSchema(); + const existingTypesMap = schema ? schema.getTypeMap() : Object.create(null); + const definedTypes = Object.create(null); + for (const def of context.getDocument().definitions) { + if ((0, _predicates.isTypeDefinitionNode)(def)) { + definedTypes[def.name.value] = true; + } + } + const typeNames = [...Object.keys(existingTypesMap), ...Object.keys(definedTypes)]; return { NamedType(node, _1, parent, _2, ancestors) { const typeName = node.name.value; - if (!typeNames.has(typeName)) { + if (!existingTypesMap[typeName] && !definedTypes[typeName]) { var _ancestors$; const definitionNode = (_ancestors$ = ancestors[2]) !== null && _ancestors$ !== void 0 ? _ancestors$ : parent; const isSDL = definitionNode != null && isSDLNode(definitionNode); - if (isSDL && standardTypeNames.has(typeName)) { + if (isSDL && standardTypeNames.includes(typeName)) { return; } - const suggestedTypes = (0, _suggestionList.suggestionList)(typeName, isSDL ? [...standardTypeNames, ...typeNames] : [...typeNames]); + const suggestedTypes = (0, _suggestionList.suggestionList)(typeName, isSDL ? standardTypeNames.concat(typeNames) : typeNames); context.reportError(new _GraphQLError.GraphQLError(`Unknown type "${typeName}".` + (0, _didYouMean.didYouMean)(suggestedTypes), { nodes: node })); @@ -39310,7 +38445,7 @@ function KnownTypeNamesRule(context) { } }; } -const standardTypeNames = new Set([..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes].map(type => type.name)); +const standardTypeNames = [..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes].map(type => type.name); function isSDLNode(value) { return 'kind' in value && ((0, _predicates.isTypeSystemDefinitionNode)(value) || (0, _predicates.isTypeSystemExtensionNode)(value)); } @@ -39429,14 +38564,14 @@ function MaxIntrospectionDepthRule(context) { } const fragment = context.getFragment(fragmentName); if (!fragment) { - // Missing fragments checks are handled by the `KnownFragmentNamesRule`. + // Missing fragments checks are handled by `KnownFragmentNamesRule`. return false; - } - // Rather than following an immutable programming pattern which has + } // Rather than following an immutable programming pattern which has // significant memory and garbage collection overhead, we've opted to // take a mutable approach for efficiency's sake. Importantly visiting a // fragment twice is fine, so long as you don't do one visit inside the // other. + try { visitedFragments[fragmentName] = true; return checkDepth(fragment, visitedFragments, depth); @@ -39446,15 +38581,14 @@ function MaxIntrospectionDepthRule(context) { } if (node.kind === _kinds.Kind.FIELD && ( // check all introspection lists - // TODO: instead of relying on field names, check whether the type is a list node.name.value === 'fields' || node.name.value === 'interfaces' || node.name.value === 'possibleTypes' || node.name.value === 'inputFields')) { // eslint-disable-next-line no-param-reassign depth++; if (depth >= MAX_LISTS_DEPTH) { return true; } - } - // handles fields and inline fragments + } // handles fields and inline fragments + if ('selectionSet' in node && node.selectionSet) { for (const child of node.selectionSet.selections) { if (checkDepth(child, visitedFragments, depth)) { @@ -39504,10 +38638,10 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ function NoFragmentCyclesRule(context) { // Tracks already visited fragments to maintain O(N) and to ensure that cycles // are not redundantly reported. - const visitedFrags = new Set(); - // Array of AST nodes used to produce meaningful errors - const spreadPath = []; - // Position in the spread path + const visitedFrags = Object.create(null); // Array of AST nodes used to produce meaningful errors + + const spreadPath = []; // Position in the spread path + const spreadPathIndexByName = Object.create(null); return { OperationDefinition: () => false, @@ -39515,16 +38649,16 @@ function NoFragmentCyclesRule(context) { detectCycleRecursive(node); return false; } - }; - // This does a straight-forward DFS to find cycles. + }; // This does a straight-forward DFS to find cycles. // It does not terminate when a cycle was found but continues to explore // the graph to find all possible cycles. + function detectCycleRecursive(fragment) { - if (visitedFrags.has(fragment.name.value)) { + if (visitedFrags[fragment.name.value]) { return; } const fragmentName = fragment.name.value; - visitedFrags.add(fragmentName); + visitedFrags[fragmentName] = true; const spreadNodes = context.getFragmentSpreads(fragment.selectionSet); if (spreadNodes.length === 0) { return; @@ -39576,21 +38710,28 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-All-Variable-Uses-Defined */ function NoUndefinedVariablesRule(context) { + let variableNameDefined = Object.create(null); return { - OperationDefinition(operation) { - var _operation$variableDe; - const variableNameDefined = new Set((_operation$variableDe = operation.variableDefinitions) === null || _operation$variableDe === void 0 ? void 0 : _operation$variableDe.map(node => node.variable.name.value)); - const usages = context.getRecursiveVariableUsages(operation); - for (const { - node - } of usages) { - const varName = node.name.value; - if (!variableNameDefined.has(varName)) { - context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${varName}" is not defined by operation "${operation.name.value}".` : `Variable "$${varName}" is not defined.`, { - nodes: [node, operation] - })); + OperationDefinition: { + enter() { + variableNameDefined = Object.create(null); + }, + leave(operation) { + const usages = context.getRecursiveVariableUsages(operation); + for (const { + node + } of usages) { + const varName = node.name.value; + if (variableNameDefined[varName] !== true) { + context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${varName}" is not defined by operation "${operation.name.value}".` : `Variable "$${varName}" is not defined.`, { + nodes: [node, operation] + })); + } } } + }, + VariableDefinition(node) { + variableNameDefined[node.variable.name.value] = true; } }; } @@ -39619,13 +38760,11 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-Fragments-Must-Be-Used */ function NoUnusedFragmentsRule(context) { - const fragmentNameUsed = new Set(); + const operationDefs = []; const fragmentDefs = []; return { - OperationDefinition(operation) { - for (const fragment of context.getRecursivelyReferencedFragments(operation)) { - fragmentNameUsed.add(fragment.name.value); - } + OperationDefinition(node) { + operationDefs.push(node); return false; }, FragmentDefinition(node) { @@ -39634,9 +38773,15 @@ function NoUnusedFragmentsRule(context) { }, Document: { leave() { + const fragmentNameUsed = Object.create(null); + for (const operation of operationDefs) { + for (const fragment of context.getRecursivelyReferencedFragments(operation)) { + fragmentNameUsed[fragment.name.value] = true; + } + } for (const fragmentDef of fragmentDefs) { const fragName = fragmentDef.name.value; - if (!fragmentNameUsed.has(fragName)) { + if (fragmentNameUsed[fragName] !== true) { context.reportError(new _GraphQLError.GraphQLError(`Fragment "${fragName}" is never used.`, { nodes: fragmentDef })); @@ -39671,24 +38816,32 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-All-Variables-Used */ function NoUnusedVariablesRule(context) { + let variableDefs = []; return { - OperationDefinition(operation) { - var _operation$variableDe; - const usages = context.getRecursiveVariableUsages(operation); - const variableNameUsed = new Set(usages.map(({ - node - }) => node.name.value)); - // FIXME: https://github.com/graphql/graphql-js/issues/2203 - /* c8 ignore next */ - const variableDefinitions = (_operation$variableDe = operation.variableDefinitions) !== null && _operation$variableDe !== void 0 ? _operation$variableDe : []; - for (const variableDef of variableDefinitions) { - const variableName = variableDef.variable.name.value; - if (!variableNameUsed.has(variableName)) { - context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${variableName}" is never used in operation "${operation.name.value}".` : `Variable "$${variableName}" is never used.`, { - nodes: variableDef - })); + OperationDefinition: { + enter() { + variableDefs = []; + }, + leave(operation) { + const variableNameUsed = Object.create(null); + const usages = context.getRecursiveVariableUsages(operation); + for (const { + node + } of usages) { + variableNameUsed[node.name.value] = true; + } + for (const variableDef of variableDefs) { + const variableName = variableDef.variable.name.value; + if (variableNameUsed[variableName] !== true) { + context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${variableName}" is never used in operation "${operation.name.value}".` : `Variable "$${variableName}" is never used.`, { + nodes: variableDef + })); + } } } + }, + VariableDefinition(def) { + variableDefs.push(def); } }; } @@ -39714,9 +38867,6 @@ var _printer = __webpack_require__(/*! ../../language/printer.mjs */ "../../../n var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _sortValueNode = __webpack_require__(/*! ../../utilities/sortValueNode.mjs */ "../../../node_modules/graphql/utilities/sortValueNode.mjs"); var _typeFromAST = __webpack_require__(/*! ../../utilities/typeFromAST.mjs */ "../../../node_modules/graphql/utilities/typeFromAST.mjs"); -/* eslint-disable max-params */ -// This file contains a lot of such errors but we plan to refactor it anyway -// so just disable it for entire file. function reasonMessage(reason) { if (Array.isArray(reason)) { return reason.map(([responseName, subReason]) => `subfields "${responseName}" conflict because ` + reasonMessage(subReason)).join(' and '); @@ -39732,14 +38882,15 @@ function reasonMessage(reason) { * * See https://spec.graphql.org/draft/#sec-Field-Selection-Merging */ + function OverlappingFieldsCanBeMergedRule(context) { // A memoization for when two fragments are compared "between" each other for // conflicts. Two fragments may be compared many times, so memoizing this can // dramatically improve the performance of this validator. - const comparedFragmentPairs = new PairSet(); - // A cache for the "field map" and list of fragment names found in any given + const comparedFragmentPairs = new PairSet(); // A cache for the "field map" and list of fragment names found in any given // selection set. Selection sets may be asked for this information multiple // times, so this improves the performance of this validator. + const cachedFieldsAndFragmentNames = new Map(); return { SelectionSet(selectionSet) { @@ -39753,6 +38904,7 @@ function OverlappingFieldsCanBeMergedRule(context) { } }; } + /** * Algorithm: * @@ -39812,43 +38964,43 @@ function OverlappingFieldsCanBeMergedRule(context) { // GraphQL Document. function findConflictsWithinSelectionSet(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentType, selectionSet) { const conflicts = []; - const [fieldMap, fragmentNames] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet); - // (A) Find find all conflicts "within" the fields of this selection set. + const [fieldMap, fragmentNames] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet); // (A) Find find all conflicts "within" the fields of this selection set. // Note: this is the *only place* `collectConflictsWithin` is called. + collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap); if (fragmentNames.length !== 0) { // (B) Then collect conflicts between these fields and those represented by // each spread fragment name found. for (let i = 0; i < fragmentNames.length; i++) { - collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fieldMap, fragmentNames[i]); - // (C) Then compare this fragment with all other fragments found in this + collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fieldMap, fragmentNames[i]); // (C) Then compare this fragment with all other fragments found in this // selection set to collect conflicts between fragments spread together. // This compares each item in the list of fragment names to every other // item in that same list (except for itself). + for (let j = i + 1; j < fragmentNames.length; j++) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fragmentNames[i], fragmentNames[j]); } } } return conflicts; -} -// Collect all conflicts found between a set of fields and a fragment reference +} // Collect all conflicts found between a set of fields and a fragment reference // including via spreading in any nested fragments. + function collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fragmentName) { const fragment = context.getFragment(fragmentName); if (!fragment) { return; } - const [fieldMap2, referencedFragmentNames] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment); - // Do not compare a fragment's fieldMap to itself. + const [fieldMap2, referencedFragmentNames] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment); // Do not compare a fragment's fieldMap to itself. + if (fieldMap === fieldMap2) { return; - } - // (D) First collect any conflicts between the provided collection of fields + } // (D) First collect any conflicts between the provided collection of fields // and the collection of fields represented by the given fragment. - collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fieldMap2); - // (E) Then collect any conflicts between the provided collection of fields + + collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fieldMap2); // (E) Then collect any conflicts between the provided collection of fields // and any fragment names found in the given fragment. + for (const referencedFragmentName of referencedFragmentNames) { // Memoize so two fragments are not compared for conflicts more than once. if (comparedFragmentPairs.has(referencedFragmentName, fragmentName, areMutuallyExclusive)) { @@ -39857,15 +39009,15 @@ function collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFiel comparedFragmentPairs.add(referencedFragmentName, fragmentName, areMutuallyExclusive); collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, referencedFragmentName); } -} -// Collect all conflicts found between two fragments, including via spreading in +} // Collect all conflicts found between two fragments, including via spreading in // any nested fragments. + function collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentName2) { // No need to compare a fragment to itself. if (fragmentName1 === fragmentName2) { return; - } - // Memoize so two fragments are not compared for conflicts more than once. + } // Memoize so two fragments are not compared for conflicts more than once. + if (comparedFragmentPairs.has(fragmentName1, fragmentName2, areMutuallyExclusive)) { return; } @@ -39876,57 +39028,57 @@ function collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFra return; } const [fieldMap1, referencedFragmentNames1] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment1); - const [fieldMap2, referencedFragmentNames2] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment2); - // (F) First, collect all conflicts between these two collections of fields + const [fieldMap2, referencedFragmentNames2] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment2); // (F) First, collect all conflicts between these two collections of fields // (not including any nested fragments). - collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); - // (G) Then collect conflicts between the first fragment and any nested + + collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (G) Then collect conflicts between the first fragment and any nested // fragments spread in the second fragment. + for (const referencedFragmentName2 of referencedFragmentNames2) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, referencedFragmentName2); - } - // (G) Then collect conflicts between the second fragment and any nested + } // (G) Then collect conflicts between the second fragment and any nested // fragments spread in the first fragment. + for (const referencedFragmentName1 of referencedFragmentNames1) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, referencedFragmentName1, fragmentName2); } -} -// Find all conflicts found between two selection sets, including those found +} // Find all conflicts found between two selection sets, including those found // via spreading in fragments. Called when determining if conflicts exist // between the sub-fields of two overlapping fields. + function findConflictsBetweenSubSelectionSets(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, parentType1, selectionSet1, parentType2, selectionSet2) { const conflicts = []; const [fieldMap1, fragmentNames1] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType1, selectionSet1); - const [fieldMap2, fragmentNames2] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType2, selectionSet2); - // (H) First, collect all conflicts between these two collections of field. - collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); - // (I) Then collect conflicts between the first collection of fields and + const [fieldMap2, fragmentNames2] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType2, selectionSet2); // (H) First, collect all conflicts between these two collections of field. + + collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (I) Then collect conflicts between the first collection of fields and // those referenced by each fragment name associated with the second. + for (const fragmentName2 of fragmentNames2) { collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fragmentName2); - } - // (I) Then collect conflicts between the second collection of fields and + } // (I) Then collect conflicts between the second collection of fields and // those referenced by each fragment name associated with the first. + for (const fragmentName1 of fragmentNames1) { collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap2, fragmentName1); - } - // (J) Also collect conflicts between any fragment names by the first and + } // (J) Also collect conflicts between any fragment names by the first and // fragment names by the second. This compares each item in the first set of // names to each item in the second set of names. + for (const fragmentName1 of fragmentNames1) { for (const fragmentName2 of fragmentNames2) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentName2); } } return conflicts; -} -// Collect all Conflicts "within" one collection of fields. +} // Collect all Conflicts "within" one collection of fields. + function collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap) { // A field map is a keyed collection, where each key represents a response // name and the value at that key is a list of all fields which provide that // response name. For every response name, if there are multiple fields, they // must be compared to find a potential conflict. - for (const [responseName, fields] of fieldMap.entries()) { + for (const [responseName, fields] of Object.entries(fieldMap)) { // This compares every field in the list to every other field in this list // (except to itself). If the list only has one item, nothing needs to // be compared. @@ -39943,21 +39095,21 @@ function collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames } } } -} -// Collect all Conflicts between two collections of fields. This is similar to, +} // Collect all Conflicts between two collections of fields. This is similar to, // but different from the `collectConflictsWithin` function above. This check // assumes that `collectConflictsWithin` has already been called on each // provided collection of fields. This is true because this validator traverses // each individual selection set. + function collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, fieldMap1, fieldMap2) { // A field map is a keyed collection, where each key represents a response // name and the value at that key is a list of all fields which provide that // response name. For any response name which appears in both provided field // maps, each field from the first field map must be compared to every field // in the second field map to find potential conflicts. - for (const [responseName, fields1] of fieldMap1.entries()) { - const fields2 = fieldMap2.get(responseName); - if (fields2 != null) { + for (const [responseName, fields1] of Object.entries(fieldMap1)) { + const fields2 = fieldMap2[responseName]; + if (fields2) { for (const field1 of fields1) { for (const field2 of fields2) { const conflict = findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, field1, field2); @@ -39968,14 +39120,12 @@ function collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentName } } } -} -// Determines if there is a conflict between two particular fields, including +} // Determines if there is a conflict between two particular fields, including // comparing their sub-fields. + function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, field1, field2) { - var _node1$directives, _node2$directives; const [parentType1, node1, def1] = field1; - const [parentType2, node2, def2] = field2; - // If it is known that two fields could not possibly apply at the same + const [parentType2, node2, def2] = field2; // If it is known that two fields could not possibly apply at the same // time, due to the parent types, then it is safe to permit them to diverge // in aliased field or arguments used as they will not present any ambiguity // by differing. @@ -39983,6 +39133,7 @@ function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPai // different Object types. Interface or Union types might overlap - if not // in the current state of the schema, then perhaps in some future version, // thus may not safely diverge. + const areMutuallyExclusive = parentFieldsAreMutuallyExclusive || parentType1 !== parentType2 && (0, _definition.isObjectType)(parentType1) && (0, _definition.isObjectType)(parentType2); if (!areMutuallyExclusive) { // Two aliases must refer to the same field. @@ -39990,27 +39141,21 @@ function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPai const name2 = node2.name.value; if (name1 !== name2) { return [[responseName, `"${name1}" and "${name2}" are different fields`], [node1], [node2]]; - } - // Two field calls must have the same arguments. + } // Two field calls must have the same arguments. + if (!sameArguments(node1, node2)) { return [[responseName, 'they have differing arguments'], [node1], [node2]]; } - } - // FIXME https://github.com/graphql/graphql-js/issues/2203 - const directives1 = /* c8 ignore next */(_node1$directives = node1.directives) !== null && _node1$directives !== void 0 ? _node1$directives : []; - const directives2 = /* c8 ignore next */(_node2$directives = node2.directives) !== null && _node2$directives !== void 0 ? _node2$directives : []; - if (!sameStreams(directives1, directives2)) { - return [[responseName, 'they have differing stream directives'], [node1], [node2]]; - } - // The return type for each field. + } // The return type for each field. + const type1 = def1 === null || def1 === void 0 ? void 0 : def1.type; const type2 = def2 === null || def2 === void 0 ? void 0 : def2.type; if (type1 && type2 && doTypesConflict(type1, type2)) { return [[responseName, `they return conflicting types "${(0, _inspect.inspect)(type1)}" and "${(0, _inspect.inspect)(type2)}"`], [node1], [node2]]; - } - // Collect and compare sub-fields. Use the same "visited fragment names" list + } // Collect and compare sub-fields. Use the same "visited fragment names" list // for both collections so fields in a fragment reference are never // compared to themselves. + const selectionSet1 = node1.selectionSet; const selectionSet2 = node2.selectionSet; if (selectionSet1 && selectionSet2) { @@ -40027,8 +39172,12 @@ function sameArguments(node1, node2) { if (args2 === undefined || args2.length === 0) { return false; } + /* c8 ignore next */ + if (args1.length !== args2.length) { + /* c8 ignore next */ return false; + /* c8 ignore next */ } const values2 = new Map(args2.map(({ name, @@ -40045,26 +39194,10 @@ function sameArguments(node1, node2) { } function stringifyValue(value) { return (0, _printer.print)((0, _sortValueNode.sortValueNode)(value)); -} -function getStreamDirective(directives) { - return directives.find(directive => directive.name.value === 'stream'); -} -function sameStreams(directives1, directives2) { - const stream1 = getStreamDirective(directives1); - const stream2 = getStreamDirective(directives2); - if (!stream1 && !stream2) { - // both fields do not have streams - return true; - } else if (stream1 && stream2) { - // check if both fields have equivalent streams - return sameArguments(stream1, stream2); - } - // fields have a mix of stream and no stream - return false; -} -// Two types conflict if both types could not apply to a value simultaneously. +} // Two types conflict if both types could not apply to a value simultaneously. // Composite types are ignored as their individual field types will be compared // later recursively. However List and Non-Null types must match. + function doTypesConflict(type1, type2) { if ((0, _definition.isListType)(type1)) { return (0, _definition.isListType)(type2) ? doTypesConflict(type1.ofType, type2.ofType) : true; @@ -40082,24 +39215,24 @@ function doTypesConflict(type1, type2) { return type1 !== type2; } return false; -} -// Given a selection set, return the collection of fields (a mapping of response +} // Given a selection set, return the collection of fields (a mapping of response // name to field nodes and definitions) as well as a list of fragment names // referenced via fragment spreads. + function getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet) { const cached = cachedFieldsAndFragmentNames.get(selectionSet); if (cached) { return cached; } - const nodeAndDefs = new Map(); - const fragmentNames = new Set(); + const nodeAndDefs = Object.create(null); + const fragmentNames = Object.create(null); _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeAndDefs, fragmentNames); - const result = [nodeAndDefs, [...fragmentNames]]; + const result = [nodeAndDefs, Object.keys(fragmentNames)]; cachedFieldsAndFragmentNames.set(selectionSet, result); return result; -} -// Given a reference to a fragment, return the represented collection of fields +} // Given a reference to a fragment, return the represented collection of fields // as well as a list of nested fragment names referenced via fragment spreads. + function getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment) { // Short-circuit building a type from the node if possible. const cached = cachedFieldsAndFragmentNames.get(fragment.selectionSet); @@ -40120,16 +39253,14 @@ function _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeA fieldDef = parentType.getFields()[fieldName]; } const responseName = selection.alias ? selection.alias.value : fieldName; - let nodeAndDefsList = nodeAndDefs.get(responseName); - if (nodeAndDefsList == null) { - nodeAndDefsList = []; - nodeAndDefs.set(responseName, nodeAndDefsList); + if (!nodeAndDefs[responseName]) { + nodeAndDefs[responseName] = []; } - nodeAndDefsList.push([parentType, selection, fieldDef]); + nodeAndDefs[responseName].push([parentType, selection, fieldDef]); break; } case _kinds.Kind.FRAGMENT_SPREAD: - fragmentNames.add(selection.name.value); + fragmentNames[selection.name.value] = true; break; case _kinds.Kind.INLINE_FRAGMENT: { @@ -40140,9 +39271,9 @@ function _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeA } } } -} -// Given a series of Conflicts which occurred between two sub-fields, generate +} // Given a series of Conflicts which occurred between two sub-fields, generate // a single Conflict. + function subfieldConflicts(conflicts, responseName, node1, node2) { if (conflicts.length > 0) { return [[responseName, conflicts.map(([reason]) => reason)], [node1, ...conflicts.map(([, fields1]) => fields1).flat()], [node2, ...conflicts.map(([,, fields2]) => fields2).flat()]]; @@ -40151,6 +39282,7 @@ function subfieldConflicts(conflicts, responseName, node1, node2) { /** * A way to keep track of pairs of things when the ordering of the pair does not matter. */ + class PairSet { constructor() { this._data = new Map(); @@ -40161,10 +39293,10 @@ class PairSet { const result = (_this$_data$get = this._data.get(key1)) === null || _this$_data$get === void 0 ? void 0 : _this$_data$get.get(key2); if (result === undefined) { return false; - } - // areMutuallyExclusive being false is a superset of being true, hence if + } // areMutuallyExclusive being false is a superset of being true, hence if // we want to know if this PairSet "has" these two with no exclusivity, // we have to ensure it was added as such. + return areMutuallyExclusive ? true : areMutuallyExclusive === result; } add(a, b, areMutuallyExclusive) { @@ -40270,10 +39402,10 @@ var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../.. */ function PossibleTypeExtensionsRule(context) { const schema = context.getSchema(); - const definedTypes = new Map(); + const definedTypes = Object.create(null); for (const def of context.getDocument().definitions) { if ((0, _predicates.isTypeDefinitionNode)(def)) { - definedTypes.set(def.name.value, def); + definedTypes[def.name.value] = def; } } return { @@ -40286,15 +39418,15 @@ function PossibleTypeExtensionsRule(context) { }; function checkExtension(node) { const typeName = node.name.value; - const defNode = definedTypes.get(typeName); + const defNode = definedTypes[typeName]; const existingType = schema === null || schema === void 0 ? void 0 : schema.getType(typeName); let expectedKind; - if (defNode != null) { + if (defNode) { expectedKind = defKindToExtKind[defNode.kind]; } else if (existingType) { expectedKind = typeToExtKind(existingType); } - if (expectedKind != null) { + if (expectedKind) { if (expectedKind !== node.kind) { const kindStr = extensionKindToTypeName(node.kind); context.reportError(new _GraphQLError.GraphQLError(`Cannot extend non-${kindStr} type "${typeName}".`, { @@ -40302,8 +39434,10 @@ function PossibleTypeExtensionsRule(context) { })); } } else { - var _schema$getTypeMap; - const allTypeNames = [...definedTypes.keys(), ...Object.keys((_schema$getTypeMap = schema === null || schema === void 0 ? void 0 : schema.getTypeMap()) !== null && _schema$getTypeMap !== void 0 ? _schema$getTypeMap : {})]; + const allTypeNames = Object.keys({ + ...definedTypes, + ...(schema === null || schema === void 0 ? void 0 : schema.getTypeMap()) + }); const suggestedTypes = (0, _suggestionList.suggestionList)(typeName, allTypeNames); context.reportError(new _GraphQLError.GraphQLError(`Cannot extend type "${typeName}" because it is not defined.` + (0, _didYouMean.didYouMean)(suggestedTypes), { nodes: node.name @@ -40340,6 +39474,7 @@ function typeToExtKind(type) { } /* c8 ignore next 3 */ // Not reachable. All possible types have been considered + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function extensionKindToTypeName(kind) { @@ -40357,7 +39492,9 @@ function extensionKindToTypeName(kind) { case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION: return 'input object'; // Not reachable. All possible types have been considered - /* c8 ignore next 2 */ + + /* c8 ignore next */ + default: false || (0, _invariant.invariant)(false, 'Unexpected kind: ' + (0, _inspect.inspect)(kind)); } @@ -40379,6 +39516,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.ProvidedRequiredArgumentsOnDirectivesRule = ProvidedRequiredArgumentsOnDirectivesRule; exports.ProvidedRequiredArgumentsRule = ProvidedRequiredArgumentsRule; var _inspect = __webpack_require__(/*! ../../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +var _keyMap = __webpack_require__(/*! ../../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _printer = __webpack_require__(/*! ../../language/printer.mjs */ "../../../node_modules/graphql/language/printer.mjs"); @@ -40402,7 +39540,8 @@ function ProvidedRequiredArgumentsRule(context) { if (!fieldDef) { return false; } - const providedArgs = new Set( // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const providedArgs = new Set( + // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ (_fieldNode$arguments = fieldNode.arguments) === null || _fieldNode$arguments === void 0 ? void 0 : _fieldNode$arguments.map(arg => arg.name.value)); for (const argDef of fieldDef.args) { @@ -40420,22 +39559,25 @@ function ProvidedRequiredArgumentsRule(context) { /** * @internal */ + function ProvidedRequiredArgumentsOnDirectivesRule(context) { var _schema$getDirectives; - const requiredArgsMap = new Map(); + const requiredArgsMap = Object.create(null); const schema = context.getSchema(); const definedDirectives = (_schema$getDirectives = schema === null || schema === void 0 ? void 0 : schema.getDirectives()) !== null && _schema$getDirectives !== void 0 ? _schema$getDirectives : _directives.specifiedDirectives; for (const directive of definedDirectives) { - requiredArgsMap.set(directive.name, new Map(directive.args.filter(_definition.isRequiredArgument).map(arg => [arg.name, arg]))); + requiredArgsMap[directive.name] = (0, _keyMap.keyMap)(directive.args.filter(_definition.isRequiredArgument), arg => arg.name); } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { var _def$arguments; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : []; - requiredArgsMap.set(def.name.value, new Map(argNodes.filter(isRequiredArgumentNode).map(arg => [arg.name.value, arg]))); + requiredArgsMap[def.name.value] = (0, _keyMap.keyMap)(argNodes.filter(isRequiredArgumentNode), arg => arg.name.value); } } return { @@ -40443,14 +39585,16 @@ function ProvidedRequiredArgumentsOnDirectivesRule(context) { // Validate on leave to allow for deeper errors to appear first. leave(directiveNode) { const directiveName = directiveNode.name.value; - const requiredArgs = requiredArgsMap.get(directiveName); - if (requiredArgs != null) { + const requiredArgs = requiredArgsMap[directiveName]; + if (requiredArgs) { var _directiveNode$argume; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argNodes = (_directiveNode$argume = directiveNode.arguments) !== null && _directiveNode$argume !== void 0 ? _directiveNode$argume : []; const argNodeMap = new Set(argNodes.map(arg => arg.name.value)); - for (const [argName, argDef] of requiredArgs.entries()) { + for (const [argName, argDef] of Object.entries(requiredArgs)) { if (!argNodeMap.has(argName)) { const argType = (0, _definition.isType)(argDef.type) ? (0, _inspect.inspect)(argDef.type) : (0, _printer.print)(argDef.type); context.reportError(new _GraphQLError.GraphQLError(`Directive "@${directiveName}" argument "${argName}" of type "${argType}" is required, but it was not provided.`, { @@ -40533,9 +39677,6 @@ exports.SingleFieldSubscriptionsRule = SingleFieldSubscriptionsRule; var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _collectFields = __webpack_require__(/*! ../../execution/collectFields.mjs */ "../../../node_modules/graphql/execution/collectFields.mjs"); -function toNodes(fieldGroup) { - return fieldGroup.map(fieldDetails => fieldDetails.node); -} /** * Subscriptions must only include a non-introspection field. * @@ -40560,22 +39701,21 @@ function SingleFieldSubscriptionsRule(context) { fragments[definition.name.value] = definition; } } - const { - groupedFieldSet - } = (0, _collectFields.collectFields)(schema, fragments, variableValues, subscriptionType, node); - if (groupedFieldSet.size > 1) { - const fieldGroups = [...groupedFieldSet.values()]; - const extraFieldGroups = fieldGroups.slice(1); - const extraFieldSelections = extraFieldGroups.flatMap(fieldGroup => toNodes(fieldGroup)); + const fields = (0, _collectFields.collectFields)(schema, fragments, variableValues, subscriptionType, node.selectionSet); + if (fields.size > 1) { + const fieldSelectionLists = [...fields.values()]; + const extraFieldSelectionLists = fieldSelectionLists.slice(1); + const extraFieldSelections = extraFieldSelectionLists.flat(); context.reportError(new _GraphQLError.GraphQLError(operationName != null ? `Subscription "${operationName}" must select only one top level field.` : 'Anonymous Subscription must select only one top level field.', { nodes: extraFieldSelections })); } - for (const fieldGroup of groupedFieldSet.values()) { - const fieldName = toNodes(fieldGroup)[0].name.value; + for (const fieldNodes of fields.values()) { + const field = fieldNodes[0]; + const fieldName = field.name.value; if (fieldName.startsWith('__')) { context.reportError(new _GraphQLError.GraphQLError(operationName != null ? `Subscription "${operationName}" must not select an introspection top level field.` : 'Anonymous Subscription must not select an introspection top level field.', { - nodes: toNodes(fieldGroup) + nodes: fieldNodes })); } } @@ -40587,42 +39727,6 @@ function SingleFieldSubscriptionsRule(context) { /***/ }), -/***/ "../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs": -/*!*****************************************************************************************!*\ - !*** ../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs ***! - \*****************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.StreamDirectiveOnListFieldRule = StreamDirectiveOnListFieldRule; -var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); -var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); -/** - * Stream directives are used on list fields - * - * A GraphQL document is only valid if stream directives are used on list fields. - */ -function StreamDirectiveOnListFieldRule(context) { - return { - Directive(node) { - const fieldDef = context.getFieldDef(); - const parentType = context.getParentType(); - if (fieldDef && parentType && node.name.value === _directives.GraphQLStreamDirective.name && !((0, _definition.isListType)(fieldDef.type) || (0, _definition.isWrappingType)(fieldDef.type) && (0, _definition.isListType)(fieldDef.type.ofType))) { - context.reportError(new _GraphQLError.GraphQLError(`Stream directive cannot be used on non-list field "${fieldDef.name}" on type "${parentType.name}".`, { - nodes: node - })); - } - } - }; -} - -/***/ }), - /***/ "../../../node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.mjs": /*!********************************************************************************************!*\ !*** ../../../node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.mjs ***! @@ -40647,7 +39751,9 @@ function UniqueArgumentDefinitionNamesRule(context) { return { DirectiveDefinition(directiveNode) { var _directiveNode$argume; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argumentNodes = (_directiveNode$argume = directiveNode.arguments) !== null && _directiveNode$argume !== void 0 ? _directiveNode$argume : []; return checkArgUniqueness(`@${directiveNode.name.value}`, argumentNodes); @@ -40659,15 +39765,17 @@ function UniqueArgumentDefinitionNamesRule(context) { }; function checkArgUniquenessPerField(typeNode) { var _typeNode$fields; - const typeName = typeNode.name.value; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const typeName = typeNode.name.value; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const fieldNodes = (_typeNode$fields = typeNode.fields) !== null && _typeNode$fields !== void 0 ? _typeNode$fields : []; for (const fieldDef of fieldNodes) { var _fieldDef$arguments; - const fieldName = fieldDef.name.value; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const fieldName = fieldDef.name.value; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const argumentNodes = (_fieldDef$arguments = fieldDef.arguments) !== null && _fieldDef$arguments !== void 0 ? _fieldDef$arguments : []; checkArgUniqueness(`${typeName}.${fieldName}`, argumentNodes); } @@ -40717,7 +39825,9 @@ function UniqueArgumentNamesRule(context) { }; function checkArgUniqueness(parentNode) { var _parentNode$arguments; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argumentNodes = (_parentNode$arguments = parentNode.arguments) !== null && _parentNode$arguments !== void 0 ? _parentNode$arguments : []; const seenArgs = (0, _groupBy.groupBy)(argumentNodes, arg => arg.name.value); @@ -40752,7 +39862,7 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * A GraphQL document is only valid if all defined directives have unique names. */ function UniqueDirectiveNamesRule(context) { - const knownDirectiveNames = new Map(); + const knownDirectiveNames = Object.create(null); const schema = context.getSchema(); return { DirectiveDefinition(node) { @@ -40763,13 +39873,12 @@ function UniqueDirectiveNamesRule(context) { })); return; } - const knownName = knownDirectiveNames.get(directiveName); - if (knownName) { + if (knownDirectiveNames[directiveName]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one directive named "@${directiveName}".`, { - nodes: [knownName, node.name] + nodes: [knownDirectiveNames[directiveName], node.name] })); } else { - knownDirectiveNames.set(directiveName, node.name); + knownDirectiveNames[directiveName] = node.name; } return false; } @@ -40803,20 +39912,20 @@ var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../.. * See https://spec.graphql.org/draft/#sec-Directives-Are-Unique-Per-Location */ function UniqueDirectivesPerLocationRule(context) { - const uniqueDirectiveMap = new Map(); + const uniqueDirectiveMap = Object.create(null); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives; for (const directive of definedDirectives) { - uniqueDirectiveMap.set(directive.name, !directive.isRepeatable); + uniqueDirectiveMap[directive.name] = !directive.isRepeatable; } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { - uniqueDirectiveMap.set(def.name.value, !def.repeatable); + uniqueDirectiveMap[def.name.value] = !def.repeatable; } } - const schemaDirectives = new Map(); - const typeDirectivesMap = new Map(); + const schemaDirectives = Object.create(null); + const typeDirectivesMap = Object.create(null); return { // Many different AST nodes may contain directives. Rather than listing // them all, just listen for entering any node, and check to see if it @@ -40830,24 +39939,22 @@ function UniqueDirectivesPerLocationRule(context) { seenDirectives = schemaDirectives; } else if ((0, _predicates.isTypeDefinitionNode)(node) || (0, _predicates.isTypeExtensionNode)(node)) { const typeName = node.name.value; - seenDirectives = typeDirectivesMap.get(typeName); + seenDirectives = typeDirectivesMap[typeName]; if (seenDirectives === undefined) { - seenDirectives = new Map(); - typeDirectivesMap.set(typeName, seenDirectives); + typeDirectivesMap[typeName] = seenDirectives = Object.create(null); } } else { - seenDirectives = new Map(); + seenDirectives = Object.create(null); } for (const directive of node.directives) { const directiveName = directive.name.value; - if (uniqueDirectiveMap.get(directiveName) === true) { - const seenDirective = seenDirectives.get(directiveName); - if (seenDirective != null) { + if (uniqueDirectiveMap[directiveName]) { + if (seenDirectives[directiveName]) { context.reportError(new _GraphQLError.GraphQLError(`The directive "@${directiveName}" can only be used once at this location.`, { - nodes: [seenDirective, directive] + nodes: [seenDirectives[directiveName], directive] })); } else { - seenDirectives.set(directiveName, directive); + seenDirectives[directiveName] = directive; } } } @@ -40879,7 +39986,7 @@ var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../.. function UniqueEnumValueNamesRule(context) { const schema = context.getSchema(); const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); - const knownValueNames = new Map(); + const knownValueNames = Object.create(null); return { EnumTypeDefinition: checkValueUniqueness, EnumTypeExtension: checkValueUniqueness @@ -40887,14 +39994,14 @@ function UniqueEnumValueNamesRule(context) { function checkValueUniqueness(node) { var _node$values; const typeName = node.name.value; - let valueNames = knownValueNames.get(typeName); - if (valueNames == null) { - valueNames = new Map(); - knownValueNames.set(typeName, valueNames); - } - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + if (!knownValueNames[typeName]) { + knownValueNames[typeName] = Object.create(null); + } // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const valueNodes = (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; + const valueNames = knownValueNames[typeName]; for (const valueDef of valueNodes) { const valueName = valueDef.name.value; const existingType = existingTypeMap[typeName]; @@ -40902,15 +40009,12 @@ function UniqueEnumValueNamesRule(context) { context.reportError(new _GraphQLError.GraphQLError(`Enum value "${typeName}.${valueName}" already exists in the schema. It cannot also be defined in this type extension.`, { nodes: valueDef.name })); - continue; - } - const knownValueName = valueNames.get(valueName); - if (knownValueName != null) { + } else if (valueNames[valueName]) { context.reportError(new _GraphQLError.GraphQLError(`Enum value "${typeName}.${valueName}" can only be defined once.`, { - nodes: [knownValueName, valueDef.name] + nodes: [valueNames[valueName], valueDef.name] })); } else { - valueNames.set(valueName, valueDef.name); + valueNames[valueName] = valueDef.name; } } return false; @@ -40941,7 +40045,7 @@ var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../.. function UniqueFieldDefinitionNamesRule(context) { const schema = context.getSchema(); const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); - const knownFieldNames = new Map(); + const knownFieldNames = Object.create(null); return { InputObjectTypeDefinition: checkFieldUniqueness, InputObjectTypeExtension: checkFieldUniqueness, @@ -40953,29 +40057,26 @@ function UniqueFieldDefinitionNamesRule(context) { function checkFieldUniqueness(node) { var _node$fields; const typeName = node.name.value; - let fieldNames = knownFieldNames.get(typeName); - if (fieldNames == null) { - fieldNames = new Map(); - knownFieldNames.set(typeName, fieldNames); - } - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + if (!knownFieldNames[typeName]) { + knownFieldNames[typeName] = Object.create(null); + } // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const fieldNodes = (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; + const fieldNames = knownFieldNames[typeName]; for (const fieldDef of fieldNodes) { const fieldName = fieldDef.name.value; if (hasField(existingTypeMap[typeName], fieldName)) { context.reportError(new _GraphQLError.GraphQLError(`Field "${typeName}.${fieldName}" already exists in the schema. It cannot also be defined in this type extension.`, { nodes: fieldDef.name })); - continue; - } - const knownFieldName = fieldNames.get(fieldName); - if (knownFieldName != null) { + } else if (fieldNames[fieldName]) { context.reportError(new _GraphQLError.GraphQLError(`Field "${typeName}.${fieldName}" can only be defined once.`, { - nodes: [knownFieldName, fieldDef.name] + nodes: [fieldNames[fieldName], fieldDef.name] })); } else { - fieldNames.set(fieldName, fieldDef.name); + fieldNames[fieldName] = fieldDef.name; } } return false; @@ -41011,18 +40112,17 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-Fragment-Name-Uniqueness */ function UniqueFragmentNamesRule(context) { - const knownFragmentNames = new Map(); + const knownFragmentNames = Object.create(null); return { OperationDefinition: () => false, FragmentDefinition(node) { const fragmentName = node.name.value; - const knownFragmentName = knownFragmentNames.get(fragmentName); - if (knownFragmentName != null) { + if (knownFragmentNames[fragmentName]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one fragment named "${fragmentName}".`, { - nodes: [knownFragmentName, node.name] + nodes: [knownFragmentNames[fragmentName], node.name] })); } else { - knownFragmentNames.set(fragmentName, node.name); + knownFragmentNames[fragmentName] = node.name; } return false; } @@ -41055,28 +40155,27 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ */ function UniqueInputFieldNamesRule(context) { const knownNameStack = []; - let knownNames = new Map(); + let knownNames = Object.create(null); return { ObjectValue: { enter() { knownNameStack.push(knownNames); - knownNames = new Map(); + knownNames = Object.create(null); }, leave() { const prevKnownNames = knownNameStack.pop(); - prevKnownNames != null || (0, _invariant.invariant)(false); + prevKnownNames || (0, _invariant.invariant)(false); knownNames = prevKnownNames; } }, ObjectField(node) { const fieldName = node.name.value; - const knownName = knownNames.get(fieldName); - if (knownName != null) { + if (knownNames[fieldName]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one input field named "${fieldName}".`, { - nodes: [knownName, node.name] + nodes: [knownNames[fieldName], node.name] })); } else { - knownNames.set(fieldName, node.name); + knownNames[fieldName] = node.name; } } }; @@ -41105,18 +40204,17 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-Operation-Name-Uniqueness */ function UniqueOperationNamesRule(context) { - const knownOperationNames = new Map(); + const knownOperationNames = Object.create(null); return { OperationDefinition(node) { const operationName = node.name; - if (operationName != null) { - const knownOperationName = knownOperationNames.get(operationName.value); - if (knownOperationName != null) { + if (operationName) { + if (knownOperationNames[operationName.value]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one operation named "${operationName.value}".`, { - nodes: [knownOperationName, operationName] + nodes: [knownOperationNames[operationName.value], operationName] })); } else { - knownOperationNames.set(operationName.value, operationName); + knownOperationNames[operationName.value] = operationName; } } return false; @@ -41147,7 +40245,7 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ */ function UniqueOperationTypesRule(context) { const schema = context.getSchema(); - const definedOperationTypes = new Map(); + const definedOperationTypes = Object.create(null); const existingOperationTypes = schema ? { query: schema.getQueryType(), mutation: schema.getMutationType(), @@ -41159,12 +40257,14 @@ function UniqueOperationTypesRule(context) { }; function checkOperationTypes(node) { var _node$operationTypes; + // See: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const operationTypesNodes = (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; for (const operationType of operationTypesNodes) { const operation = operationType.operation; - const alreadyDefinedOperationType = definedOperationTypes.get(operation); + const alreadyDefinedOperationType = definedOperationTypes[operation]; if (existingOperationTypes[operation]) { context.reportError(new _GraphQLError.GraphQLError(`Type for ${operation} already defined in the schema. It cannot be redefined.`, { nodes: operationType @@ -41174,7 +40274,7 @@ function UniqueOperationTypesRule(context) { nodes: [alreadyDefinedOperationType, operationType] })); } else { - definedOperationTypes.set(operation, operationType); + definedOperationTypes[operation] = operationType; } } return false; @@ -41202,7 +40302,7 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * A GraphQL document is only valid if all defined types have unique names. */ function UniqueTypeNamesRule(context) { - const knownTypeNames = new Map(); + const knownTypeNames = Object.create(null); const schema = context.getSchema(); return { ScalarTypeDefinition: checkTypeName, @@ -41220,13 +40320,12 @@ function UniqueTypeNamesRule(context) { })); return; } - const knownNameNode = knownTypeNames.get(typeName); - if (knownNameNode != null) { + if (knownTypeNames[typeName]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one type named "${typeName}".`, { - nodes: [knownNameNode, node.name] + nodes: [knownTypeNames[typeName], node.name] })); } else { - knownTypeNames.set(typeName, node.name); + knownTypeNames[typeName] = node.name; } return false; } @@ -41257,7 +40356,9 @@ function UniqueVariableNamesRule(context) { return { OperationDefinition(operationNode) { var _operationNode$variab; + // See: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const variableDefinitions = (_operationNode$variab = operationNode.variableDefinitions) !== null && _operationNode$variab !== void 0 ? _operationNode$variab : []; const seenVariableDefinitions = (0, _groupBy.groupBy)(variableDefinitions, node => node.variable.name.value); @@ -41288,6 +40389,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.ValuesOfCorrectTypeRule = ValuesOfCorrectTypeRule; var _didYouMean = __webpack_require__(/*! ../../jsutils/didYouMean.mjs */ "../../../node_modules/graphql/jsutils/didYouMean.mjs"); var _inspect = __webpack_require__(/*! ../../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +var _keyMap = __webpack_require__(/*! ../../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _suggestionList = __webpack_require__(/*! ../../jsutils/suggestionList.mjs */ "../../../node_modules/graphql/jsutils/suggestionList.mjs"); var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); @@ -41326,11 +40428,11 @@ function ValuesOfCorrectTypeRule(context) { if (!(0, _definition.isInputObjectType)(type)) { isValidValueNode(context, node); return false; // Don't traverse further. - } - // Ensure every required field exists. - const fieldNodeMap = new Map(node.fields.map(field => [field.name.value, field])); + } // Ensure every required field exists. + + const fieldNodeMap = (0, _keyMap.keyMap)(node.fields, field => field.name.value); for (const fieldDef of Object.values(type.getFields())) { - const fieldNode = fieldNodeMap.get(fieldDef.name); + const fieldNode = fieldNodeMap[fieldDef.name]; if (!fieldNode && (0, _definition.isRequiredInputField)(fieldDef)) { const typeStr = (0, _inspect.inspect)(fieldDef.type); context.reportError(new _GraphQLError.GraphQLError(`Field "${type.name}.${fieldDef.name}" of required type "${typeStr}" was not provided.`, { @@ -41371,6 +40473,7 @@ function ValuesOfCorrectTypeRule(context) { * Any value literal may be a valid representation of a Scalar, depending on * that scalar type. */ + function isValidValueNode(context, node) { // Report any error at the full type expected by the location. const locationType = context.getInputType(); @@ -41384,11 +40487,12 @@ function isValidValueNode(context, node) { nodes: node })); return; - } - // Scalars and Enums determine if a literal value is valid via parseLiteral(), + } // Scalars and Enums determine if a literal value is valid via parseLiteral(), // which may throw or return an invalid value to indicate failure. + try { - const parseResult = type.parseLiteral(node, undefined /* variables */); + const parseResult = type.parseLiteral(node, undefined + /* variables */); if (parseResult === undefined) { const typeStr = (0, _inspect.inspect)(locationType); context.reportError(new _GraphQLError.GraphQLError(`Expected value of type "${typeStr}", found ${(0, _printer.print)(node)}.`, { @@ -41408,8 +40512,8 @@ function isValidValueNode(context, node) { } } function validateOneOfInputObject(context, node, type, fieldNodeMap, variableDefinitions) { - var _fieldNodeMap$get; - const keys = Array.from(fieldNodeMap.keys()); + var _fieldNodeMap$keys$; + const keys = Object.keys(fieldNodeMap); const isNotExactlyOneField = keys.length !== 1; if (isNotExactlyOneField) { context.reportError(new _GraphQLError.GraphQLError(`OneOf Input Object "${type.name}" must specify exactly one key.`, { @@ -41417,7 +40521,7 @@ function validateOneOfInputObject(context, node, type, fieldNodeMap, variableDef })); return; } - const value = (_fieldNodeMap$get = fieldNodeMap.get(keys[0])) === null || _fieldNodeMap$get === void 0 ? void 0 : _fieldNodeMap$get.value; + const value = (_fieldNodeMap$keys$ = fieldNodeMap[keys[0]]) === null || _fieldNodeMap$keys$ === void 0 ? void 0 : _fieldNodeMap$keys$.value; const isNullLiteral = !value || value.kind === _kinds.Kind.NULL; const isVariable = (value === null || value === void 0 ? void 0 : value.kind) === _kinds.Kind.VARIABLE; if (isNullLiteral) { @@ -41507,11 +40611,11 @@ var _typeFromAST = __webpack_require__(/*! ../../utilities/typeFromAST.mjs */ ". * See https://spec.graphql.org/draft/#sec-All-Variable-Usages-are-Allowed */ function VariablesInAllowedPositionRule(context) { - let varDefMap; + let varDefMap = Object.create(null); return { OperationDefinition: { enter() { - varDefMap = new Map(); + varDefMap = Object.create(null); }, leave(operation) { const usages = context.getRecursiveVariableUsages(operation); @@ -41521,7 +40625,7 @@ function VariablesInAllowedPositionRule(context) { defaultValue } of usages) { const varName = node.name.value; - const varDef = varDefMap.get(varName); + const varDef = varDefMap[varName]; if (varDef && type) { // A var type is allowed if it is the same or more strict (e.g. is // a subtype of) than the expected type. It can be more strict if @@ -41542,7 +40646,7 @@ function VariablesInAllowedPositionRule(context) { } }, VariableDefinition(node) { - varDefMap.set(node.variable.name.value, node); + varDefMap[node.variable.name.value] = node; } }; } @@ -41551,6 +40655,7 @@ function VariablesInAllowedPositionRule(context) { * which includes considering if default values exist for either the variable * or the location at which it is located. */ + function allowedVariableUsage(schema, varType, varDefaultValue, locationType, locationDefaultValue) { if ((0, _definition.isNonNullType)(locationType) && !(0, _definition.isNonNullType)(varType)) { const hasNonNullVariableDefaultValue = varDefaultValue != null && varDefaultValue.kind !== _kinds.Kind.NULL; @@ -41703,9 +40808,6 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.specifiedSDLRules = exports.specifiedRules = exports.recommendedRules = void 0; -var _DeferStreamDirectiveLabelRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveLabelRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs"); -var _DeferStreamDirectiveOnRootFieldRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnRootFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs"); -var _DeferStreamDirectiveOnValidOperationsRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnValidOperationsRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs"); var _ExecutableDefinitionsRule = __webpack_require__(/*! ./rules/ExecutableDefinitionsRule.mjs */ "../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs"); var _FieldsOnCorrectTypeRule = __webpack_require__(/*! ./rules/FieldsOnCorrectTypeRule.mjs */ "../../../node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.mjs"); var _FragmentsOnCompositeTypesRule = __webpack_require__(/*! ./rules/FragmentsOnCompositeTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.mjs"); @@ -41726,7 +40828,6 @@ var _PossibleTypeExtensionsRule = __webpack_require__(/*! ./rules/PossibleTypeEx var _ProvidedRequiredArgumentsRule = __webpack_require__(/*! ./rules/ProvidedRequiredArgumentsRule.mjs */ "../../../node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.mjs"); var _ScalarLeafsRule = __webpack_require__(/*! ./rules/ScalarLeafsRule.mjs */ "../../../node_modules/graphql/validation/rules/ScalarLeafsRule.mjs"); var _SingleFieldSubscriptionsRule = __webpack_require__(/*! ./rules/SingleFieldSubscriptionsRule.mjs */ "../../../node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.mjs"); -var _StreamDirectiveOnListFieldRule = __webpack_require__(/*! ./rules/StreamDirectiveOnListFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs"); var _UniqueArgumentDefinitionNamesRule = __webpack_require__(/*! ./rules/UniqueArgumentDefinitionNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.mjs"); var _UniqueArgumentNamesRule = __webpack_require__(/*! ./rules/UniqueArgumentNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueArgumentNamesRule.mjs"); var _UniqueDirectiveNamesRule = __webpack_require__(/*! ./rules/UniqueDirectiveNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.mjs"); @@ -41742,14 +40843,7 @@ var _UniqueVariableNamesRule = __webpack_require__(/*! ./rules/UniqueVariableNam var _ValuesOfCorrectTypeRule = __webpack_require__(/*! ./rules/ValuesOfCorrectTypeRule.mjs */ "../../../node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.mjs"); var _VariablesAreInputTypesRule = __webpack_require__(/*! ./rules/VariablesAreInputTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/VariablesAreInputTypesRule.mjs"); var _VariablesInAllowedPositionRule = __webpack_require__(/*! ./rules/VariablesInAllowedPositionRule.mjs */ "../../../node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.mjs"); -// Spec Section: "Defer And Stream Directive Labels Are Unique" - -// Spec Section: "Defer And Stream Directives Are Used On Valid Root Field" - -// Spec Section: "Defer And Stream Directives Are Used On Valid Operations" - // Spec Section: "Executable Definitions" - // Spec Section: "Field Selections on Objects, Interfaces, and Unions Types" // Spec Section: "Fragments on Composite Types" @@ -41786,8 +40880,6 @@ var _VariablesInAllowedPositionRule = __webpack_require__(/*! ./rules/VariablesI // Spec Section: "Subscriptions with Single Root Field" -// Spec Section: "Stream Directives Are Used On List Fields" - // Spec Section: "Argument Uniqueness" // Spec Section: "Directives Are Unique Per Location" @@ -41817,10 +40909,12 @@ const recommendedRules = exports.recommendedRules = Object.freeze([_MaxIntrospec * The order of the rules in this list has been adjusted to lead to the * most clear output when encountering multiple validation errors. */ -const specifiedRules = exports.specifiedRules = Object.freeze([_ExecutableDefinitionsRule.ExecutableDefinitionsRule, _UniqueOperationNamesRule.UniqueOperationNamesRule, _LoneAnonymousOperationRule.LoneAnonymousOperationRule, _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule, _KnownTypeNamesRule.KnownTypeNamesRule, _FragmentsOnCompositeTypesRule.FragmentsOnCompositeTypesRule, _VariablesAreInputTypesRule.VariablesAreInputTypesRule, _ScalarLeafsRule.ScalarLeafsRule, _FieldsOnCorrectTypeRule.FieldsOnCorrectTypeRule, _UniqueFragmentNamesRule.UniqueFragmentNamesRule, _KnownFragmentNamesRule.KnownFragmentNamesRule, _NoUnusedFragmentsRule.NoUnusedFragmentsRule, _PossibleFragmentSpreadsRule.PossibleFragmentSpreadsRule, _NoFragmentCyclesRule.NoFragmentCyclesRule, _UniqueVariableNamesRule.UniqueVariableNamesRule, _NoUndefinedVariablesRule.NoUndefinedVariablesRule, _NoUnusedVariablesRule.NoUnusedVariablesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _DeferStreamDirectiveOnRootFieldRule.DeferStreamDirectiveOnRootFieldRule, _DeferStreamDirectiveOnValidOperationsRule.DeferStreamDirectiveOnValidOperationsRule, _DeferStreamDirectiveLabelRule.DeferStreamDirectiveLabelRule, _StreamDirectiveOnListFieldRule.StreamDirectiveOnListFieldRule, _KnownArgumentNamesRule.KnownArgumentNamesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _ValuesOfCorrectTypeRule.ValuesOfCorrectTypeRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsRule, _VariablesInAllowedPositionRule.VariablesInAllowedPositionRule, _OverlappingFieldsCanBeMergedRule.OverlappingFieldsCanBeMergedRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule, ...recommendedRules]); + +const specifiedRules = exports.specifiedRules = Object.freeze([_ExecutableDefinitionsRule.ExecutableDefinitionsRule, _UniqueOperationNamesRule.UniqueOperationNamesRule, _LoneAnonymousOperationRule.LoneAnonymousOperationRule, _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule, _KnownTypeNamesRule.KnownTypeNamesRule, _FragmentsOnCompositeTypesRule.FragmentsOnCompositeTypesRule, _VariablesAreInputTypesRule.VariablesAreInputTypesRule, _ScalarLeafsRule.ScalarLeafsRule, _FieldsOnCorrectTypeRule.FieldsOnCorrectTypeRule, _UniqueFragmentNamesRule.UniqueFragmentNamesRule, _KnownFragmentNamesRule.KnownFragmentNamesRule, _NoUnusedFragmentsRule.NoUnusedFragmentsRule, _PossibleFragmentSpreadsRule.PossibleFragmentSpreadsRule, _NoFragmentCyclesRule.NoFragmentCyclesRule, _UniqueVariableNamesRule.UniqueVariableNamesRule, _NoUndefinedVariablesRule.NoUndefinedVariablesRule, _NoUnusedVariablesRule.NoUnusedVariablesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _KnownArgumentNamesRule.KnownArgumentNamesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _ValuesOfCorrectTypeRule.ValuesOfCorrectTypeRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsRule, _VariablesInAllowedPositionRule.VariablesInAllowedPositionRule, _OverlappingFieldsCanBeMergedRule.OverlappingFieldsCanBeMergedRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule, ...recommendedRules]); /** * @internal */ + const specifiedSDLRules = exports.specifiedSDLRules = Object.freeze([_LoneSchemaDefinitionRule.LoneSchemaDefinitionRule, _UniqueOperationTypesRule.UniqueOperationTypesRule, _UniqueTypeNamesRule.UniqueTypeNamesRule, _UniqueEnumValueNamesRule.UniqueEnumValueNamesRule, _UniqueFieldDefinitionNamesRule.UniqueFieldDefinitionNamesRule, _UniqueArgumentDefinitionNamesRule.UniqueArgumentDefinitionNamesRule, _UniqueDirectiveNamesRule.UniqueDirectiveNamesRule, _KnownTypeNamesRule.KnownTypeNamesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _PossibleTypeExtensionsRule.PossibleTypeExtensionsRule, _KnownArgumentNamesRule.KnownArgumentNamesOnDirectivesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsOnDirectivesRule]); /***/ }), @@ -41840,6 +40934,7 @@ exports.assertValidSDL = assertValidSDL; exports.assertValidSDLExtension = assertValidSDLExtension; exports.validate = validate; exports.validateSDL = validateSDL; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _visitor = __webpack_require__(/*! ../language/visitor.mjs */ "../../../node_modules/graphql/language/visitor.mjs"); var _validate = __webpack_require__(/*! ../type/validate.mjs */ "../../../node_modules/graphql/type/validate.mjs"); @@ -41866,30 +40961,32 @@ var _ValidationContext = __webpack_require__(/*! ./ValidationContext.mjs */ "../ * Optionally a custom TypeInfo instance may be provided. If not provided, one * will be created from the provided schema. */ + function validate(schema, documentAST, rules = _specifiedRules.specifiedRules, options, /** @deprecated will be removed in 17.0.0 */ typeInfo = new _TypeInfo.TypeInfo(schema)) { var _options$maxErrors; const maxErrors = (_options$maxErrors = options === null || options === void 0 ? void 0 : options.maxErrors) !== null && _options$maxErrors !== void 0 ? _options$maxErrors : 100; - // If the schema used for validation is invalid, throw an error. + documentAST || (0, _devAssert.devAssert)(false, 'Must provide document.'); // If the schema used for validation is invalid, throw an error. + (0, _validate.assertValidSchema)(schema); - const abortError = new _GraphQLError.GraphQLError('Too many validation errors, error limit reached. Validation aborted.'); + const abortObj = Object.freeze({}); const errors = []; const context = new _ValidationContext.ValidationContext(schema, documentAST, typeInfo, error => { if (errors.length >= maxErrors) { - throw abortError; + errors.push(new _GraphQLError.GraphQLError('Too many validation errors, error limit reached. Validation aborted.')); // eslint-disable-next-line @typescript-eslint/no-throw-literal + + throw abortObj; } errors.push(error); - }); - // This uses a specialized visitor which runs multiple visitors in parallel, + }); // This uses a specialized visitor which runs multiple visitors in parallel, // while maintaining the visitor skip and break API. - const visitor = (0, _visitor.visitInParallel)(rules.map(rule => rule(context))); - // Visit the whole document with each instance of all provided rules. + + const visitor = (0, _visitor.visitInParallel)(rules.map(rule => rule(context))); // Visit the whole document with each instance of all provided rules. + try { (0, _visitor.visit)(documentAST, (0, _TypeInfo.visitWithTypeInfo)(typeInfo, visitor)); } catch (e) { - if (e === abortError) { - errors.push(abortError); - } else { + if (e !== abortObj) { throw e; } } @@ -41898,6 +40995,7 @@ typeInfo = new _TypeInfo.TypeInfo(schema)) { /** * @internal */ + function validateSDL(documentAST, schemaToExtend, rules = _specifiedRules.specifiedSDLRules) { const errors = []; const context = new _ValidationContext.SDLValidationContext(documentAST, schemaToExtend, error => { @@ -41913,6 +41011,7 @@ function validateSDL(documentAST, schemaToExtend, rules = _specifiedRules.specif * * @internal */ + function assertValidSDL(documentAST) { const errors = validateSDL(documentAST); if (errors.length !== 0) { @@ -41925,6 +41024,7 @@ function assertValidSDL(documentAST) { * * @internal */ + function assertValidSDLExtension(documentAST, schema) { const errors = validateSDL(documentAST, schema); if (errors.length !== 0) { @@ -41948,18 +41048,20 @@ Object.defineProperty(exports, "__esModule", ({ exports.versionInfo = exports.version = void 0; // Note: This file is autogenerated using "resources/gen-version.js" script and // automatically updated by "npm version" command. + /** * A string containing the version of the GraphQL.js library */ -const version = exports.version = '17.0.0-alpha.7'; +const version = exports.version = '16.9.0'; /** * An object containing the components of the GraphQL.js version string */ + const versionInfo = exports.versionInfo = Object.freeze({ - major: 17, - minor: 0, + major: 16, + minor: 9, patch: 0, - preReleaseTag: 'alpha.7' + preReleaseTag: null }); /***/ }), @@ -69309,7 +68411,7 @@ function createContextHook(context) { var _a; const value = React.useContext(context); if (value === null && (options == null ? void 0 : options.nonNull)) { - throw new Error(`Tried to use \`${((_a = options.caller) == null ? void 0 : _a.name) || useGivenContext.caller.name}\` without the necessary context. Make sure to render the \`${context.displayName}Provider\` component higher up the tree.`); + throw new Error(`Tried to use \`${((_a = options.caller) == null ? void 0 : _a.name) || "a component"}\` without the necessary context. Make sure to render the \`${context.displayName}Provider\` component higher up the tree.`); } return value; } diff --git a/netbox/project-static/dist/netbox-external.css b/netbox/project-static/dist/netbox-external.css index 72d40bc92374a4b76fd8b69e4b8cd7fc29569f34..702520216bbe5e036eeb5e41d8ac1cdff2adfee6 100644 GIT binary patch delta 45 zcmV+|0Mh@sv=)}M7J!5SgaU*Egaot&_imS)Cj}3e*lz_Mmo;w%N0-QN1unO{Zv}lS DmAw%j delta 71 zcmbQXMQq0wv4$4L7N!>F7M3ln-}3}ZiW2jRa}rBZBQ*>S3Mw=erW@w7>P}b5XLZMv L+n$}zx>^eWp?Vm} diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 969d5c73a704424190120ac1a6c96af13085b025..7059ca7ad42e23ffde683766aecf19cce866a1df 100644 GIT binary patch literal 390052 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


jhunFMLxAbbCsXD@^v$hdbsuaG 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 literal 390388 zcmcG%dsiDr_V4}w^D3}T7M4PT!MTpG%&{>ZJL4F~kYqBz_z2WM+oDAz5t{(-{rP_uFgfjQAHL6zrYlF| zyg$v?Rrq5+77p^`qRiinN9Xx?dYO$Lj0Te=K90XZhr4T%1ow<81gJ zt4y+^JLPakNr@5m8S;Xd#l;es5~xC zF02DRe;gN6b*A6H^@kUEH!p5F-J;l=76-k&$bKxs0NSYI(YURB$!(ZvaedvM7QL&R zPUrYy<)}X#@~DX{E>4d$KJBN)US1q@){Eoz;G$FOV064NxS)QgGdTSZZO8faVytD| zWG~8UI-^sKF+8A|*>+pYk>}01G zRS$E^?Ko6f)fL;`^`&JE0N-?Ovg6axht^+eTdr9Bv;Zm~0qbTqz1GOEy>)$EFFd{| zkEX?_Y#F46`E+4iEYRY}7kMv&nRSl^=5cYa$1W`{`pm{*W?DP58y5$S*|p1}*H=$! z+_}CkS$M*Zo6dR#XM^VNqiP)jW?u9P#w#y|!;Q&l`$FLFbbu!-Hb~zq05|`vynB~V zz8?)PhPe5_%>LVs>FId%@y_}~uRkbO2BR|HC<|(?*xEbYFrk%kJ{b*v%d0ml)6=|c zPYOostTQQroQd_%&xe;z&z+7>lS%q|Uk-Y|^r`5`ot+ufwZ?YDrO@yyfX^8w2pHeD z78kv2rGGZq@Sp9y1Cd5IwDDdmq+ML}l1Mij&BxxfXp4ueoKDX^fiw0OM5pwo(++)3 z^5HQXc~Sa^gVu&hx^W?Kc5U{+$-h?8s>={Dq#t@$qw>|LKj=Qs;FU-DWYYb8nvKft zAkRj}$K8`WL*$&C%(42Rw0>}WWeEZWRoP?V)O%X`cSgjKRV5Kir@3@+A94YgO8`%lA=|V zWj=nf`~9m{{pGWK*uU(qrlNd09p+y6a5XE+qv6FMe_0L+h-);quIOKHLXpFvC7fAK zg)Qdw>jhg+P(dl}$8wQJ&Nr#WLQql=IoQp^QFfg*+Cw=C91ca~Fl}n@ zhZR@WR_a>~6S~QM%g4qQT5BtRTUmS9g4gt}K>c0ka4-7hUe>!S(m%<&KN<(zg)3|gbKyYuQ%=zkVErU%J?UPKGqltv5zD(H z?Rk2%O5JI0h~OM_=3QBT_r0WR_eiz3KAppKw3wgRpYDsX3SZ>?0W0i&vZt5j`NcF$ zV-QN1SlJ&w1D(5l>)E&yTV5QCy@+Few5kCjh7H|fs@`||WB%=4=GhqxH)4Hvn4wmm z9(8xK(dba)bhq*hmNdSMbOulEUgW}B$nHrwuuAV$AQt%Y>?|J? z5Eyt|j=wdk7?87*Q-HU0&S3@v~rhva& z7bsV#S?G-7HRpmcq*U}iuAKGH>&iexY~v2Cr2-AA&KyEX3nlses3_a5Y@yZ3c6xam z#?>G2`&a#*iV}Hvp@+$DC#~$>YG*xS{6ZeJj)2-i`?vWC``vCm@*&#$`;)zYKR)>U z@%7_Qdyl96{hfo)H#(2@_aAtb$1U)Eqjgf8wGcaJtD2|ww8UMXAI%_aMYjDMX0cvQN=Wu&|pms{;>X9r}Oz* z{)M!idYiL98Y8s%{OeUT*XBezSutVisMDQ|-$un?K~<_%=d*BSSg<)!+v4I(fjX+1 zk7jm-%5}0{TofqkC2B4Us#(}FLDE{{Wv%n+?A+31udn@Qtz9*z3&xBniHWzuzQBP3 zBdV&6^GXvOAb!NAs<&<*(2oqv^#X(F9@-`yuXn%?8=}Gn3?J~NYW&KfA``;&JFFzu z;x+{aLwIPp;4I419Gkh)_+%2H@X8hgepClzKF6#ZgAnJ#V%ly&KPxCS`KRq;6#CBN z-fCw9y%+Y->Xx<5EfWBPmZ@pVaJJP&%*TpJ;6f9%$z#}PpF1pp$%MWGL7=WyOErs` zs!@*x-e=+z`NVcP{Em#x%O=LJ^GUOG^!shaAM?Wx#q_o}qnX0E9Wq`~n$3COI(9YN zCx#k9a6Wj{-s>;_ez5oN{RjK2kM}=4T-~4UkN3;{?ElY}GIm-+xD*2zvO{v+eIuOeXmlBVJ~ha}12h9hh`^qE@YG z{%QIEm30U!Wbd)4C34rN#pBiW&a_xwRw<}(T#V6SPmAFoE?k(R4R)jvdI!(fvw+=E zG_^bGx|;55gNk#z2ahz|gB27{v9TI84y{&z-92j~2pLGVo}v(DQ3AdgUuPZ^vw(4q zJ_xtm$yzOjPHM<)x*{%(fJ`iB0&CZF9zU7}o$_&OsYJXydXNepJ+K8tFLWP{FeH$--1H0c&d8v+EpAv5vLXkacwja_!yqX8U?nHd%sOv9Pwv8MK5yo$`N(zcsqd2x z>>=9Ru2wHgy0^qE+zTA(FUPqjh7o+jczvl;jr+Zg8+zP35O)DCmBY8Ux}F!05IDoU zJei*Iu(Sk+TsgnMmq?%HB@U~rt31$4fa9O+F?Lo>?Vp;7i9FOTW`M@@bcEx{d;kUH zilsemYdMl2)6uyYq>QoAbUHe#*8k`uVtn)w;+6x%toX&nvOu6$VGc!f4>g7jtKw%g1tP3=>BMN{)AVx`Apk+da*lhCuFGPUV5G5 z{Gc|@inKG&Z8c#fKdg+f_~e2Ev`Ck#3k?o`Lk$|_xD$pe`EW`<>tRB5iv5XQ`eDUA zk-az$qreOyF{Br6pwSR&2tQO+>NYiaU0c}udPhy2ebf6(3&TtVd<`8y2-Mv)aA?b` z6^k*|8S^b|r9Y_o@h#2Y#pZ0;Ilnvfh3|U0>#n=X)b3oVDi$4Tl?)DzDLb)Y;RNI} z)ljvoY5wlx7|7C4sI#{Z6>8T;1C|=iypXT(=^FP*Pb>I~w8Uz>@-K}SYX9MQbXW}^ z7OF9UNUhxE0kUt^X6VG2EZTN(qjqXD{mf@7gbX{-=+NEj&BgsZ*Tm$?%w8NxLC5@T zqJ0V0Ywr+v5y}P7GUE zTr>+d5nGcK%n+f|iZ`rGE)I3Vj*WstG)i2l7j-iIdz^XVDYbUY*Y{=l&i3EYzAjZ= zs6>Wf6pgC~@$h$+oV6Z2Zgudx)W%q==7!s);ph0*%-m=fEokt;;D}W%oY~m39r%th zLf7qYJDtt}-BnF=&XejJ>!{cND%6+yr8B_R#vaSpui%B)DGqg-(Ckz1Q=k9PeDCTL z7bjly3*1QRH$MGQ-?2{W|CibR|5lrGbcfJ?{HdvGIj&Uj!hghKsS35)raBzB7SUj# zVuM;0#3upqk6x3TH!NloJ9DjRD`jeRy(}IfJA&?qQMlx&gV~6AUKXY=VkaMs&cq(0 z4g6;0#|A<*)*~fq<=OV;kKb>--hKCGd*|iu%k9_i-n`w~+X<$jZZbXXMTRrIht0vYM(1veZP2EpkX%o55Nobu75hghruqd`0>$xQKI*@y+ zgNaZLH>eNyeq0xo!Y`1aKB0B+!Dk_1WzKNPF%6BMZNI)tr%nDFh+Vy*{JN!RZsw?9TI^!89B``GHHj z#i5^E_%#>$S;7J}!!}9&LHFF4_nTtKe9F;HDgr`YZwLc?$eb)W)BAVk`(ZnO{E z_jgZ;$>Qul$A$~7`%4&S_gf32a^b$2p$iV9e6UcC7S7yZcn`>6%um#% zGMC_N>wu21q#E~$VzzQM!?+c0l$QgyNC=0@*h>P-=$PeOSd&lijF>t<&9nngoxQur z=rf%VOwb(`H|zM4DRQflGt{T}L&v$=v@&9=%-g>yzS$L*{ zo{SRMCLvb?Iol$nA=r6_#R8!X3TkP`ZrCv~?97gwC+xgdSwD16Wvnfsvi4LY`i`N( z)_z)!HG$E)5R7Ppy(=;{UxRfjfWH;MJ7T0}^V{$WI3NfluMeNf>cfK(Hav{Wj{}`M zpcNPr;D-w;{L{;q12D3Kmgu5Pry@-}vJ(|Yw0Krm&2qPn7R+@Pu6CHQR}2p7v(qV{ zfCFm4yXe$rC&8$5$b=Vpmd@`}_Cl5Nt8M=0t(b$^XQ0yDGrogg0=g z=0^8%O*5h1{niqA*SgQlH1d#A+m#(NM?RBGgy1o|2oLh!&~JFWKJ_X1k49LWbE z_B08kt&_yG)s2(H-^G`2UAIXY(0uC5R`n!#L5q@}6*I;z84uju`sePu*W1sw3~6TH zZf<{Xrj}PQL`hr5b|{Rv2D=vlksEg5jN2a{at{oD^ysS&t_7k`Sa5&5$*i8>#}pI0 zj#?2O=W1VG`Q{7d>0wpqM%zkpNxU*DV2!ttOWFViOvt!VL!N60*i{)AA%n0S3ZzpR z@KOmrRKk5EFrvOupXiguM1!u$Y@zB=8A7ur^AKvhZcbMbEljsj!=}pu{=6mPp+Nwz zHjUcey}oVQR1N`&IBSRauA`5$dSNn^V}B2MGtQTuMEN>x2UaVSNpAL%2ijS^W>LLz zwCEIgHCbGAp4cd?qy&uj3bGlM7Dq5DZv}~%jR(hx@5G*@5%_jVrwHeBAM(oyn^luT z8X-YXfUh$pohX>?US1EDHXBS52S_U6`R zGr+5=e}8Lrpe+CGT<8D1wRY^h0dL=>YM^JgH2qU>sN+eED^?&7n>E0g)?&CJ#Y0#l zW?4gm_0E}b%L*;b&0pVwW&_kj8r)K;E>WJ=SLTQemJz^Zh1OIR1{Fo|{guqXTsB;x!HjG6mW~0Owi-8OtU{M*V zT?pLN0JRJjp4aKik~z#zin7%Ob#JfaY$wzLQ~#(I=3T1`dfr~ghO;W*KP1wbj{WEe({KConW<~NCrnRYUZTa>m!6^_-m_C9x+8uEtpwmoPb*m z24bQjiVueSBwVlYP8*j>l3IYhvWj8yC{^Pjj(w`TI(uh~eOfW1TNI>Q-Zm8^@TI2H zq99?yL?z)SoZ`M?)`xBWy}5DELUo;D1A0s=?1D~7x0}6$;oKu&Sxt)nBovI&A(?lN zLa^@R z>im0u!n=Rz=T)0u|In|S&cTD~JmMF}s<;5KhwEWAJv+?W@b0sGC4^v_VsA=)2dKry z>{MQ?|9nfWrL_*>y3)`IpNwHa(X9qQ&5LEuji}_{WP|>mr)_2TWk-bJpxub-uJ%;# zq&YAFO~;0+$0Yd)dFqB<#)SfiYh6p#+TZ8OoEkHwKQ~$9XYj#BS80`C)s1?(O{V-% z$Misr^B`XBbToG+?B1F9aLlcuoXLh)Iwc4X3cHWef2TJG5$tfc$1a zJPMkC&fT>L9ksPPSY?gXNx^+AfNRx!#h>BrdNwgUL_L7sLN)5h2;=^j~?s z&kZ&z_Q$sNY+C=wJCOlaZxt}$uRjR^j4h6*J#Hs*j+QMbFq?zqeiqKPS`|Ah>sTJp z7={LnV04lggVEI`C;@-0T=5YO5?A)}!Ctlx?>%^65~gpo)RNfnJ>)EKdH1hPZG#Wrpgl)T!YBddC0eN086W{z9jb zo#dPpk6U7!#4jglhz*XD&*&>wt)|LLs5Thx$hF9fzl6TlCDUwmItPfWL-y&|VSaw% zw>C%I`!?rljymRz{6J19P)m#~YvJ~4EF3kBsu9_MGzCw&BV@SENV7!GCTTHi!^Hli==co)HJr z(TBW*H%B1h?TJLFqyxNgx?q1N(Dz^JDe;V(j}}OlkT$cq$03t+lR|(-w5PNmvV-dv zleokrt3uca&*d-#VQNS0&ePm@@Q`nLu2c`1os5^j9I7k1>&O=O|7bX@`N)tNI4VJS zd?Hie0#Dcc?k%_omjE~R62ED2Qgy~{teXR`ao@QAo=n1Ci~HD9QfY9|Q!foI4(>Pl zIpTught$n@+I(poMsI5)#}<{WvzvsSD|h)4)UPX^T)2mkRCPvisYvt)sNf@J>w~kk zcYBDZhn7nUUvAL93pxo841 z8fOQ@OWCsv>e3V%tEf0LDr$J+cifT8wBnc^m&eQnG^R^(gH*pC^1fgRaBMW*A~i#$ zOzTkp)Zh{IHDo=4)^z0G^g9vTOb&pK9LYM9b=~ad)Xv{bfmM6OB+I%cGyvvPq3J~c ze$;L6-D?{>L|4E#(2&D4lsP@H!KhI6oiacx!j+L4%Zaii=+e6de#n7St^hGM;0C zSe(SCb~GIi|B+wXJV1y(ziZ<_vo?;j`^XFEx~3ip4dIEkI}Jwr7M!kDM*YDMK|_cn ziJ&n5r@}nLIcKfY8EXVw2-XOF`!9?Vc$Q;KJv7NtkR5`B1P7-m2Bdcgfl2ZTOFh^? z3%0Pc@Z3Rt>=FKYAdNI=X^V@flykTavKlZ@Bk5JBE0eeVC zHB4nn;R6isIqU3@=;zksA?6e~q=+KYiW)jDc$f<6%=I;tK~MwY5Nt)Kkurq_{>+o4 zaMX2=T?IC5ER8xoBQzbB!n5`hCt{5oBL|6F2wu*?^U*k2xXn@=Kh1gxg_+7DjAQTF zy`}0WI#A362&6Krz3tqAJ@#j4yKngFaDlz!VF_TlbBkrCs zw)mTC1NmTEg^oSMs5HwZ45?lrfkOzLHEcF7-_`fKmv%gM*?67M!RKHKcs`gptz;76 zMF(S=BulPx#tyaqP((OatpaX6la1QSdc(WqbJdS=t{Vee987VNJ`Eov%;=83(zw=% z)g?Ts9=Q;}jq;W1!ohFQtrx3!bpZ?ZVc`?T4(HB$EFLJVuXkUR+(%!#e~_h2Ik&t7;Ay7PiqFNx zStqje;VO=}N{;v&QO7+?yx{2%IJ1f)NgcAgiI5Pyw;{(Y#X`LtzGJoM~(mmTuJ2b2s(2d*<$z2>^Q$;hxph8*^#t|*+i91k@nI;A4s)wiI6yw^8D<=jasD9o6xFnD<`hSmcq3L!v>InQabOYKyo)PWlq z{7a1z(g+Yz85Ll=*~>*}lz`Le^nB8_93ZWaShX{5Y}r#N>R$nK<$6MCN?FbkL!QikHiW(Ci9` z?X9h@ex0qYu07O0UmPUK1E)L!b1b2SiEKptN7*6l;jP!ah)kt=t)|Phae8wG%OF9}c9emvcMfP6G%vNsu_A`ic53y@JVAud;|fh2(mYxgpbD z$g(HrEBj|CKLIFuFl~^Gti)@nooxdb=iENh4qT3d#}<&$jGv{WFPp>3e}~b%`t6kyav;j&%JSEgq0ACG_EmqvR%W7 z#2urH-bdkhvm$PvZEadc-`i6&MVfTT(@d0}h%xSv#lwi5GB!1xwMMfFVz@03k$sZi zI=CKWD&EO|73-~C+h?!z$e8=Ey*ODLDm>dTv|L# z)T|mY(MBLJF#JA>5FN+nOFu(onv*r&Tz^fyj{9NUygQmw(cP6w}wUm zlily+yf^HPP(sCQ0TbbAc5mQ~X>U4L>Iq{fzee2;k{qlfGU`2cvO-&h=O zNeM38`ot2flo;E1fwLaW{h}JkM}ZODTZ_yQtK(y(U&uQH^|&2?THjit#9OhEl}p{q zn z{u-1ee4x5;SlDs&hHcdg({UJu(Xv8NRrZSP!OXo(GzH~gT$!6uceE{J`b}gdq>aA1 zkx``M9V|c*0KaX3lB3Ss>O z!8V=CR5SZnp$xYa^ z4M()+q7KIZ!8uJLv#3ASB11!Pc9khifuYi6)3wfulEg^>K*LB!7TE0o{+bpFnHXYm z+Pdkv%XAW=$%aS0?Q;ltByUJs>RgI37E8ra_I7oOHdo8h5lw?J8YxBAkWGpSwfF;viCk;pr6Y*MADV1qLqsRsd<`ls+%{5~%tdr7LLDQODWod#Wlv3H z+odi}SiBu!qTK6j$e*LnrBMj89+k_tRiZG?<2G;khsG+*f@G3@OzJCi^T6|8VMm6% ze;fc1M@Yih6uXKzn0wj2zw+S0=X?M6^F5U2KHoK1R!-u!@DU!mpyOFvhBWJ2D>N2+ zXRWyUJ1bP(0FH%&gZna*VZbv#B;J(54kpasjRfSJfpaY~SY-lxD2O7vt~kF*Op3u~J%@>z zkQ`Szw(Vr-V1ZzxpZUzn&k3G=X)%$d~2)lG8k8~ow=x_+do1{hD3Hp@fJhWs($+$|;s@jW_L%)ZCt z4It-C5Y9}wqsRq;|4@VL2CeL$WbR6^d+LKmJ__Y}xUY6$71a)6B6my0Ry}u%f0{&5 zo66k+NutMHwTRSMT2infPdC`ggzPR?0Ugzt&ow5(kTDX6c5`d}$#~qqL=UpRaA}O? z7oN|2BJ-wE05f$VXv%6YE=kU~Xfe!3eirn?45h<8kKvyoj84;$(>f+(l)neLq#(#S zfHQeaDBx3@U^qOn6G5~kwC9j0h3uU*i2u~U)=Kx+XI~;p#qD4d_`V9ezy^58`2YL= z{-5S(Cn?VBm_zhng`1*S(iDbBIr+)ZJw39Y#B-C+Es-u^;@$n_{gs2IZl}FM23>jH z**Ky}hNKlxw4bLh)+J!ZBM_Y|x}M{jJlSg^(>=a0qZbd!0^(0g48^RLdZ3k{7uPYc zF9rc$-+F9v>J!*rNB{Q@mnY`(O@bYSTt%KJb7ZBLMHvr|3^E=-HEQe;SroOiTi%$y z=9&OzhD%GA@p`O;T2veXfN50WMVUB_*3ja0SP(XAY~{-Zjfv(qlEe|U}#)| zjj7dFUpw1iz-+xeB)(!P1&+t{Z3X>w@SrN5~)?+2?pa>4EVp-C^mp_jJ3Z^WY?FeYUpz*+a5KH^Qna z5rbiC5Qx$_>MP+)c@t0c=*)bxgcG?EI{&KfMMt)o(5SW42v>&}honrlPs4b~pVA-e zOC+8r)6#%+k@~&5;VGYRyH)GTv>v0CTA})CFa5 z1WE$xPkP^tC1e9_rUq?oy?wj=w!6@hX;Dosty(il2n(Q1G@9P1PtySg-AYCV7`?zJ zKn(}nddyPF)ds-BLgj$)#HE70*Rl@eji<{)DWi7$)Fdk_if63$xezw16O|LmAK0pW zlfzI>rnh7VD9@l07@}?6jh0?}CAx;6Gf!M_2y(|HF#sHZW|=p8lb{V`V>^}eoZ`n^d`77Ea|V&!E&6#k-mzRCUL`BEa7ibNC4=T1qP(9FkSEN2d$OMC2aO> zMyc(*jM9~hF>wPRiZ;wNFVLIaM?-LjU%-hg>fxo+x4o1bUs|T!xl~jy?iEG-;-$5@ z(m?`Vhyn~t)MWYY6s9?6nparqXGG`mZ6MZ-@@~8Dsw{{F(nam^PT;QBu0hz)wMP03 z0$id2dYou?!Yi9OP?eiJfWWgL3#V@haI9~5JUct;laQZCrJ1GOa{K8QXO3*gJ)u${ zCfSK7|1r|94nZT>i^xm+TH-Bc`H#8k>NMyWH-bT_#goWu@^$VKo}?tMoHSK6BJd?LE zhx_u9giYk^+Ac0G5H6bhCG+p@*QHJrunkvD`?g;1?vpzKH8evVLWAPR`5MfFD8$B#73fMS0#_WBv?`@ z`~DM5URfS`;1bn0GPA22ZerO@f4gCU64NC7Kdo!%E4bD(V%^vol6n_)tb_AMi411O zf?*>RP07KnvYEbv#sS|3Dpul`xIwzXo=C2HPmaJ9Nzy#vEP&6N2WgC)4`E%7>oVBx zfJ)fB$a|y+h(P^YovXyclGtt>1J}BZxr4vvsQnMJQ(Xz7& za}kbGb9SAnR7{3oTJfa7WIP+N990BG`!`gRjw&r68a@2nNs+KdkV>!X!G>}Db z=ZgMk*V8z}ZN&+|LX|k6G3lWuP05^S_^*L;c@4~N0NEX`b!hThUnBV|U`A~H_qX~F z=H@f1U9w6bYe>b51gz-wg|27P|1}O}{j)J*1VE*j>~P|zP;{|{KRQ@Fc1#M|EQ*T` zJ>|~uGk<@Q#%y5$ajrUvVJ}<9MLryW0eGM7Yq?6R*@zzq*G3ya4EwQ+AvG5Il$0oHx=;gGL`H3l2^2gRtRpjvxxpKPw^=qNy0s)9`4 z_(^up=V3=%ko)P0TOtjP8V38aDmD zv&kOELiI*rT#BKlgW8$bX|)_lMA*9)bq|bimd1@MtAP;cg!TIH6p&_^dK8PXA-B1D zNf#|40RA-OH&b;-KR?d+h;?zU&(82ryGgo3rn${sMc>oldtqWjld$BgBl~PxH*5!L zE~hEAZ>s7dX23>bcx*&DgXv0}uGp2>wLSBSO~kmz=mv6S-f~YCKT((pR&C<#8ov%lPFH{<0;vXP1_+!Cy!u!Shd+6EGw^6!D`NIB>N)%r zEF&&jqhfm5hGZnL4G}`*5FgOB5PTtc)k_Gf)c4ej0WH&8e#2~0bwreA*;I|X$9!SP zoD=_rK07rvC4Q&fQ3Q5`D+bKsNDa+`e?b~b*qv~mp%|^%<6?Yd1XbSlM%K=4C-B|gyHlbN0QcRZxK2|4120zGZ%fog)^Gu|`mCc7ywbzA4hw=XyO#tI?m zoIvn8I)yaKEj8dzORb(RFM$WuRL?b4-!>FZ@&r{9U-{E`XOd|)f10Kfg;NmzO$h=w z*XKMLE$xyd0%HIibR0JTxIs}bp;2^y*A>pQ#vJXu9|V7YklXTL&C_!$QR8 zIx*owRq3gJe}h`liBXR<=KfBQTmlL>&Z(}Z&J+kx?DIMAbeRF9<2}Sd>?AzYWis)= zshs$*q&9jfCVM#3FGulvPO%P{h-QxN$Nir6mz@|8p#=O5^hB1(9<`4ua_py1utNfS z1V_LDs&gkM5(W<)dwj(ocjtE`F|b2-K&BRN#V{379y-E@F#=*}^Zq#PM&t99cCA8M ziIFM5oMPEm$LP9M!RjSK(*=ueb6Ypaz*UCtZgi6|JeR;y&7Ucu(yevujjr~R8R(8$ z)jQkYG?E+hgi()vD)Nupr6CtWat8PAIkXH3iIf?A1ouW-8;ELaXH)GGtI(u616fUB zhmCO{@nfx~ind2?*phLcRt}BWxqZM^aifwk6k_S1@RF@XZ|^ z*wx0uZnRZ%s0tM&6sEAYR#QM?607=Lijxv2;%>qI)FxCbt#|hDKXm3>7W**>qS{om z`Nl6~npE!imO|l%pU4=qsBNnn7(!TYq&*!a8&XO^Ba=JROVgTfPNSPwLZJ<5S0UXO(w+ z#k>z})t3q0^3f-a8E;6jtnOjE^<(*=9DOVoh@USok~zgK7vQmmvLye~A#)V7b@sf| z;5rqnFlB;^0j|or^+lZW11YBdiQ(|s!=P#<^^k^@hIm`MisNks(U6E1#$+2Fc;H(J ziUzBWW~I@+xVGy&ZzM=y+hh9{JX!`E(A77;T?D+kER@m>)CyQc7Y&F%)l_y(A@Xtg zCK~t4x>y$YwD^m~T~qTmXXP2ZebvkoeqcK}9xt!ioe&fU-}A(jY<;QNk%ra4uDIi3 zGjE`GM_PZxeqjPkj_Nw*LbLLQ%4=epRctvrhd(vj`L~eORFPGUrl#H2ngUgy^9%b# zvYE7+132DX1r!&`eHs211Z|YAH=ZQj-HEEXP`70tGn5q_0Dx2dCNxpyKeON{E!tOy zXgwdgEsL0MWrz7G-*z93D;ebrdm74R<=2M#lQ5baO<4^7%vd!fay85~VwA5dK-olX zMZVyecT+TwLv_;O7ANTJ(k%hLQezNdoY&H=_(iXE!CeyEv#}!`jB{#{L{oJaC$P*7 zwWCHQPh@4w&E055j)abcp>JhX{|j^9=-jJboz%^!n4vP^#`f`<8`M83hQor?;+(OHAN)xMf`_eQ{&Kc6lM5QBi(E+xVolEX@aQ?4 zlTpH6c^dz;T{X5*=U`!8NtLlXP+ORay3R@Zm-@AFT@rbQ2UFLi@^D&X%1hPvc49Q4 z<4Si2U{c(5hI)Z^l*1PbkzD$tHYz6aGDmVnD z2X-~jHVszw1OB@z-D=ee_iyWSsl_qo%jGA0)Mv{YLU_UEs1er_Ul#ME7reQ4&dBj+ ziWKB`Gt0bIAtb~sm7(b$1Ftttb~fxH1xSc>*ayKw^qf@BTaM=r`-6C-_v4tXHz5Y7 z-o1Q%3E11wUJBdJFjEeFwHPHs8xCV{evCXJ;H7H(y1rAP0}l^q1X?0-@eZRRz$v+= z#uc7$dFT52rKC_ReRPzJb7sDI4h`)&=?G2p+UBfsTnzH=IW1t|MwK!c3!-+EXQrFl zszyjoCM5S9Y1x&hyBZVx6f$UyvtX54ksGMd*Fq)tx`gzHjp4)96!;BVQF^06dBzaY zr!m#1|N6tZ+7f-8^Gm7#{nC*vx+1_FT@54OxG*H%33JFd?%_onvhM2mP~SA+p^0R1 z?-1GwLc+u&hFIp;gs4zjI-+ja{LWY5p{0PlGWyLXS* z95a+8$2P!s-xV?k6sQ^F#&o4$!JOgN0mhOA=z_snK0Ojr6O3_@2a@RWU3&b`6SLo+ z6XePKAdIv_apH_Ao$B7&95UEqhb4+#_Dg-qx{-|MV^lgZ^h>2Np!Z+Gwj7qdUtoQe z@qJqM4$F|*hrBPUOOcdqB6C_B48eDJ17>*VUCP`(IW0RHy-f%9ImrRJ2o=Wf-ZMv+ zq1VxV=`A04ELI4kvcLU9QgJE9p6x_IoI`k1wk6nH9~#t%H`n zzcDNW_J_WbTLy3>-IqO4UN+i>RAT3KaPbNEbpYEw56ji@Qd%ybfJu|{UukuB4zKml zp>0*r`yDk;N>Lid!1@W_LOUsAiUs9eo_*GV#)Xdl=&4!L-|)%KFof4>`Lv_`4?L{{ z^b*6!Nz#Dl-zdwVIz#*vW7ck)*lZn4UO{kUt^*f_QFIY|I!9}Au=@yT!>#{b54KL$ zJU0!U6V4U>sks?P#CrlqGy=SU%;q8n*XbJ!?_HD{C1F9YUmCCbt(F|EhS5&1jRrX5 z=ceh>>~6rvkA(hOibK!rP0Y9dE2%=sI1(bIS#g^ZaRv&a zc)3^SSD`Usv{t?Q8b%m7C5CmAuzypcQUFMQ&pGnEr%O)v0>`7|j_L-x7nV^BZUh5< zErExCh=-u}aOxnN*zgyeS8RGv{qn9ZY8}8q&S80;-TDEysy}{QHs=)zhkK3uW6>)? z<+M(EXe2Lm+80YZF09_5McJ7u_EPp)(R&lFkxa6)QV*_~DsJ9?(HSr3?5tF0UKskC zmP&Odk@`Caz*c1n!+d3_&VEOBu*jrS-5T&K$3O%@`xPrE;@1Lxi8><4A;kLv0uB*? znw=8Gbab6eLOAFP`o-~|0Laf)uP#5pig#B z`_msM()P?pH%WXKKyq@Cz2qpu?%ES3^Iee<@Sm!7f0C$;j=k+AP3&uJ588e(;y<=n(p z2jQnRPQO#bP?9u;c}>C8fCgO|Rh$IQ+yX#%5eKxyroD87RL&xPYS9@K!_NQ|;g!{i zfE4;t;9${~@lXdl?-v(8i+)UaOQ7UB?Ss!T$|UC2W1dnS#V7-@8}96s<_&b+gCz0U zFJ*5>x<~fhevlFLsj7(6{Di*3!!OP=|6ca$pY(ji$)megA^+9&zat~tPs@Z(Euz;S zt!_LmIcz7x7kt+(JkxBQ=%7#IwB57P_8ep=SyT-Te6($@Nhs{*zc zHT9V07o~@K7gAM!YTz`~8s?@oH~%pb~wb(}kh ztsly4SBWVl1Aa&ARoFYl6+H#Qhslx~u=_IUxHakxb~Zs8QjzT*9U8W&7y_W~T3EuG zfZSFFr0_tT;-r0ElC>=WbuJz~dT5YwSl(ih)cn0PXN(3)-V}A(!vk~yOFh%w#_V@~ z5eRw;ulA&I#>sRS!*0_iN>jZ$lH1$u(gWD_G8$=D(dfT)jeGsqGTyPmxk;gM*Kn8r zALAacqZG!D`Nvr7mRkI{xfD_|=w;GW^{vR+DK+2LrUVXGBp19;eZEeteApiw_TR|X z5$r#i-A4c2{^UmR!CgB+IS{&X_S;BE%eA`%yE;~Txi!OJf?TjE#TddUrXuxf zYT`>EKFQ>4q;AnRd5@b2g{V|A9a^;hT^WirklM@@8@ihJRO!3W0*IK2T%}KDzD$4g_`ZlHd06NsE7>7HpahT5{@fAl>L-8D-_qb)uSgbo4eq zANG&(*cS}pk7iV>9r{ZaFYAp6M-M1=ehqKq>ZW@oN1{9uV$62MRFJ|wB5!5j)kM3J zOsvM6b>vfjA6@BUv2uS^hsA=;@`bI?d}rDY1^9%ig;zMknqeGrhS>(;!Lkhss)iDn z@XA4s-cOihhrIP(7?-PZ4sp6?s4LCdeNH%aHRoNiA=g+P4yeN_u*giB@f0i97wQ6O zagq3dq&ZbZ5y5GXnVSh|cRlV*ILq>!;A`P%Xpx;PRelvRqpLPq zH@PchM9R+JNiVSpsEGs7Zd8Tvtnl4dzz2qK0hfX3NHHM7rVw=%9{Jk(I9#6_7If4h z*&`R~BE928AfSsL@V+|6nAQS%rK!L5%R9c#J7*hed5A-b)~$6iD8@QCu=O{5>vu!o zZSIYLfG{()3O9w)jM+C5+S9 z%#)WeiU2ePF?x-VP4iFm)bSmM788pV+0n9bFEBmpR-k3Y^VewV4_Cj$p`jL$d&rTT z8a(dNBExT-Or}~4QnqXM@fDE=7sJ7hVz01fXD-QY$;)c0Mi<9(t#$VU2MG{Bpb(t0 z?gOxDba`kFqe)X3M$&}!R0UBfj35A)fq3u;_#RW@VRCV#?=+CG zyLXQgnpR7)bhZvI_{+m@zb4kr?uTb@Mb!!C@w;9zvs3v6XEQ7V1Ed zM0&+Nj-gsV7+bF)m&%qg)AnK3e2HOQEA0eDfXR@y;U zHSeWWAIsK2=Qz_happ~YJlys!$irW}(FrhO27Y>r4?7)J>G0vVJRE9fxOA0PmU{Xn zH~wjvnUcki4Pffb6gu2t7deAM1If@#X5Vg6q<8US;BTN{<2@%O(F^c4IdSVOl%rZd zdvxOEHK-4fQeOYgwbQRx1;*7TinpgDr3M1O@cY0&o|Ei~%j{C=A$jHI;LD7L_^BI7 zJkwq_+VD*fL@d{Ao!PEcD<3GpC3GKes)k1R^}6lxANLXDGrio|hi@v5RKFYwD-h<5xNSH}VVbmj8ASm)o_tS`!ig=zsxFFJBJYv-RZ+ z#d~R4Q#{%ZC8HjE2mcE9uI@Eobnhj86(VDwD}SGNVn*z5kSptAeuie;5E7D2cMKcA zv$y)_sioGq?L}&53oi#Tkizk;^f}5wYbOv5Qu51wcTtm)JE27@uB~D%>J=Ymx+c1~ zSbvh?Q0q=HtBE*eFTaV5)hxmtaS5?qSW)6KLF-t4BI9;hRa~S7e>11%*u}6fE+xGV zZb(Iip~1~+D77wH@&+66;qR((1EB7Uv?#u6mH1e%rlsG@)a-79M64suqpa~971JU< zA;NUE^N)ZrZP@WU7T_Dffgnh#wriMLy8!=LvGJMI-4OfDNrpGL;~IQ?t-gtfj5vj^cIUQx z__OI!8Xo_6edBpd+~^NBK0x#g)W@jK`6KxQWyMJIX5x1|!p+y6?h7S>_gpkW{NyT0 zDzvyz@Lhn%@?CHuo4qM;kZ{D92>)a_I_wV>q`oVGY;oBWDH{wpD-Ww6Z4-xdL#3)v zC#vMknp5Mejtz(YFmPdUF|j?vgXYA1$2n!YHLd|+cn)!3j8KAjE9MaZb62&Jk(GviILn&=a)E>jeR35BW6r~G@ zZctf^Pku!*F(^5UzTv(+}LKV+gOP& zJZ2tXGF!ttlUE=PPu1Cg=|33VHJ!@M@?$bxfuZ04Li&&PxRd>Jyr-+l?2N!=A|TFo z;i+2ksW_w`cWb<6)vu+diz|nKbiAdpqcelk0UcDS2o;N;{^h$=g2N|fl0}iPZe!wS z=kz|{qCQv*%U9sMA4bgG+hJtvZdB!PWq#Gul zF-Lbdd_-|ZUPlK4A=moOqp%B`9uRQ7$Z|az2;E4=Y4HgANf@e5dDLec08cIc)J5J; zW5swF!<`wj>jz4Xh z?z0oa`lm;fF_O0bo#-bq&Z4w?oiAe^4Ab}~=vvBWX9MWy3cxA-{gc6ad}HPG#qRg7 z+AX);+#~vEGQAw;j~8zJkJMPT@j}84Gbol?SA0D4NLQIxZ*Fb7P;VSPFVX?vA@x`6 ztS9oA?RRZ`q2le`g)rO#DRj;z3pue&5uY2SX=z6oQYNZS~W za>kdg!{WTYuW#b+S-u8O!RJSpE%I?>6PyKie!AL z@G{~&1_R^vQWbL)CqCV6$4Y)Ak)|jHEGWti9o+@5Rs*;sM5VGwR!@a4wR=viY#0%AzrBtwA7DPbuXh9Ta zsq?y+W1E>;x~Hh^M?hgAMy9^ZYkFwv7I=#nN6-v;LM6Ud>1U5fCf@6;k-|HhY zNrU?Rs1fzK@%zzA{z)H+oZxPS&xN)acSv5^$BEK|m#y^A1{?kpFkuxl)6mEj!(FWL z<``8uL4$axiI!!3E4!mJrzjhl)oDp_JkYzv;kVrrxi}KZG!z3Qd(zeQLNyn(S**j5=dkX=+(Yz05=B?L2-4i9q@NGvCLS{}Dj+@)hJcU4$3qk|h{^0wSIuLKS zi*Pcqu=*z!Pwj^hocA$+pZDp6<3=2$I9doq5w^FQ&fW-EU8%<|?~cpv5f+uSNMdn{ z-}5&g0cFkZpvMo-7&Bqa*vQ^>fP4xfWncvY99e379+yM-l9Q=SC2BVAWt{geb~9N`nd8n$Q$6hz3=viyEUjjg$if&O$sMDAexI=%{$CqfRzk9|l=E;=GfadXe{n42eU5 z-{7#?Fc3J`W7NIFf(x(+b-wQqIqwB>6@j&c1kg}x$n#KSd3+gG=j!P6-aYKn5_p*lzE!e_XZyNd?3fiDH#=kb_4J>a&hB z;mk~h&a32l(1Z=z9H7}^0auzhP>b>Ydwa*l!9m;?!j=IR_53C#jH*pe>40DFYz}EB zlG1Pjr35hp@r6{bq+zyCq0-mUX@AUTyT}h{MeK@G8`~%@TWcfk#NE-;;#dH$8fqs~ z8+LNUeFlxl3Dw@-YWDS4Uw!e_!GTWAT6_B!t6!|HF6+M{!o)^6@a85{Q>Cy!s_wKg#FE~E@l7AnrebvfVRj~Ta<|-fZwRf9ef2B^oTD5=I zD7Nw^-+b`}ze#Mc|7q)M-mN`e{zH&=>Zb&W=Kj=T`77|33U;li99)`z7DD_cm*5D*npW{1uZ~d$y`cuYF6!Cr=F) zU#(i5ufHaJtTlT0)l*e@#;mDsO}}K0$3EOQv|L^L+rw6N;zMj16uxG1Pri9VS8LC{ zu~mGdc|H7^il<)jAzeM({F;eA-26s>dH6M8D11y6^LcQf_}&Y?q!Sjzz+9--yT4ID z^CueTOUB_}K*7I^&&U8|=oP>WexH2vH!1=am3;Yy0QJ@C-&&dW_0w}(!*g5rSK!U+!*6VEUs8>E z8a&rn;mF~<_7!s;`TEy1|53n>FQ4<F+04J-U*KuL`c_>({FXhO z`W(Kd1v9apzO|kFnw=Tha0>T!*epl@$-#i2|VIAM{(~z9*Z0xUWux~dh4ygV$ zDBgE6Ipb2CP6E#EYpae#5aRR^%*7cx5Bfro-XWPNuGk=|1TSHRd1;2lG3uo1 z;jxy8c$=SWeL8Q~Lx?#o2$IuewnylS{E6U2 za{Ha%6$z_NB!pb((l{j&@Z=*@%t}H!G-ipGfROO*di)$%rKfv#*Z)!pJDJf?5rT(I zNa@Qa{FWZT5bw@O_A>2WU>9Q5Xoj58+h*uD>y{aVR)X!r6i_o%%#=`{&EO3BK!&nk z+xOPLl^uYYp$vUS&}6|b%P{rNXki0z*2qM4wmB@cHpwuBuQ|V^Qa}QCb+w1GTYi;szZ?gThwIvY6N*ChDbpV@LLz zYrAdMpsk6JM_Xe`X5p|P7SXxkd4fx$%@fc8bQm_iPs^#Dt0ZhbS{8d9H47qdW`N0V zwL~dcZ5+x+I#`PvVw9UqP?l;bHd)x?_6LKj&3&oIoO}u$ZfItaF1eG=r+$ zR_lga1oc6nt?+GoSHBn_ECrLCxuXh+ew5dfsXV?Ak+Gv4{?jo(FGWJc zhowytf!dn8{PID%m&hp?wo58PH%wCfBHNZPH zf$y0&Xkl&p?d`jISc~vqi|q~ku|409OWwHJ%;?P#k*PcdY%j~&WdC)?WM7ie!S|Y9 z^~r7r_Wdt7v!&9DqkqBd0SWKDp|0Tqcb;A9{%oW79t*;Oa+VWpN!l{AC!qA}qD><< z$2hm~gP%dC$eS&Wr+CZ>F;kH1gAF2{hX>qL?H2P9Q(5Zmn(!lmfFa_~i3Hhg)Q8oB z^`~&20CG*pwqGK+xA(JBodtGK>k21FwD5@gkPc#Lm_*2_}Cy zLK*ZIzw$%)6?RYpTY}M?3?1=*D2dL{T>0vBq*tl;8CPe$YXOPz-Ng=X3AONUqSsk- z{6EYY75XIq6v7F31s4(pS=Ju0O?%xDb5d-7XJfSs$=UqOYaBN2K_XSJ$qrC$skcHJ z!HeQ^=E5ziI$V6IS_BXgVFiaYE3KU+MZlqlAF(6%ntpA1HBhLFo&n=VcR3rNZMI-5 zI?NPpVT)_Pk}*ylQXhOqx*13DLfh4}+nlCxf%9p>ZeEDcVV z3UOLKMvYtR9?OW^SVpfR?^R%o=8|jJ4${fsnP8f{b6TZcp*2cXj=-KPQj8ppIh8olHz99srlSve39Y$QW4lf9xi_LJ z{{#dHJBbo6p#(NXbur+%AI;gZWGv@G@)mfldbNorO%S)Ko%>#{@LbmatN<@3&G z3Kc%AHXJG7*3otWi}i?UQ9p4rZal!9;M&Oq5`Ix{TVDp22;m1`0_Im@XjEuGXr%(q z20gziBoI7{O_yg351zB1S(p$SX4b>0de~Zmi;2iwnL$qIL`E{z$d8sAH5kAF&02Fo zW}kcLK0|6CH#j>aNOI?h)TPhkxpdfl=LCKpNk}hRM!plNT<9Fxh%M*cTra@+X1){( zy3&S1wrsUwLOgbGj&3rOwvhwINhK9&)!m|C1RaD!CA3a`!oux|m5-KWaU$6cfV^96 z2KAYxKHBlTv|+H|?i>ciR`XNjLKvc4e5=4@n z)JCm%Dr04>b5jM2gVWg}CxZ-2j#k;fl1c>-KzVw%wTKY(-O8|QtBBnt)U7C9nJ{W( z9ip*&`VMV?0umDdKfd~z#`OGDP!cWtY|V`xu<`%<3KLFnguovMdx~wjo3oxAmEAD+SUMY$?~*5tlKd z;{Y&Glo!+0*cdG&R@dHx5d~tS+W; zkD%Kcc^lcVGqeh)itzTwx6L?W7d4&V)N$OHgOfD`mL~tQl21s@jtyAZ2X6v*6BEcdy`hkP?^&>t7M1RBl)yRW^P8Br+naS%(G zaap1oMqeqFz^pvkI4jAhLd-{9#s+oVPv@B_4lrP868E+(mB9gkBGW(>w=7cs*&UN4ra2Q@mEn7f_Q6@IYet{^Lh1><1ygp7C;OITPPA8aBP%nd8 zqo|x1vtahcAgCQ=p1G~(TidNw&1?~HsW|mIFV)Ng`foz$sVg%ar9x3+TOyG7?1E;H z42hLtaaK&Bwxo{BpKW!kM)512EZwSi)U&%TNc@tt`ztuo|EekRQf3#s!8q6+?`@MK z{bO=qlG>YkK2inzhRa)3O;y`5AB)Q(a3%&HDwPkhjG>9LtPr?N0Yn`j4XRYvTbKq~ zD9P_+B!=iz(1Q$To2SKa5QTK=-KLx(U$LQXGE&=UQFYTOaRj=LVPmaFtZ%(>^WS@N}ZF~#&Av31wT+!!v6mx^HxkJadCd9 z_%OIQkIdiEA{uUc`<&pfJ=|aWa)0fs{V!J!9za7)S^=swW+=xbeP@j#>1Y(p1o$Z1 zicN2x-rRAaBT?-fmp3P2pJcu;XHZ|BYy1REQW)DO#*Yyqm9>Wv&n+EDlUmMsi08qmm(om<4gt7srZS6A z4c@w%k)+4Fiu2~ZZvw|82B_<6IxZRbH4%5FWCZL&UGk}MEwdP1OaeXc6ot!6%68pqn-ee^5 zsTM`e3U~(h>M_!{F%nIH)f2rG!5d%#7=l~MAtTlnSczW6u*K+Y2;dE16cB4BGh?(0 zyph3HMd&)UB0`Y~ToCRDqhEx}I66s;FMN09yVMRKuM*3fVW=>Y5?-?zs9GD>Yn>J+ zr$hcHG+E8JZ9wzw?GkjVgB)Xno%L-%E03Q}n*wL*p3NEP$ zQ@J+ZFE)dS85-{lf3RWp74gf8g#~@7wI>VeiYYNlw%ITlQkqi-b_}^@fu^k?KGhb=89L zvB=3N{owol(F5PMR7qLv#!pUk&7`x@(%qDQ3iYZrQIRdqi2WMrqJu2^*?O~1K_LGjHj1!bH;uKc)FC|oRA8+ z`mzBTpmZ^b$ZbaEWabUFqS725k(Ql<6sx>l?)DG$h-R+fRc}fH*3ri;+37x>D)0d+ zEQixwQi|!4ZI@U+i~61`fIn}FV!D>LiYJ2LU_D}|-g^Z0bGK#VBLPVInqDZi--MF& z5A$ItQo=m?3g3GTh4B$Df7ruUwI_126ag(Bst(_n4&WOUX7aKm*H`!cqe6cd z#5Bm5q&-;Bh4OeKkV`ek$1N^1at_5w-ok^&_gUNdrHzwMc1O>`atzCq;p$Y8GXWP) z`EbCS*+R$rS3<|cm0)~VL4kwcMQKHlC=!9rxOiZO*2j5eyy6(rHiESEWkw}@*=KPPLFLsttcH|T^zxIFe2f7rCs0*TxdB~#q4cE7M8UE| z50BOuo)}~{M}2s;3BjqV`cYZHG#nj%UjdM&&Je&zzErMD$hBE;1}Qb%1IAbmKXC3G z0^fRPj0zCwX)|C`I5ejt=gZLMj^a1?dV4&N)_$j#TMFx0?JPG6V++|F&!Pg1k3+a1 zvp|*M^D-Bo<;Q)#q-=Jt>8;#oJXdzmK7y9P^)ZobJNChXgX&BVND?z6(``qT2Y-K) zozHj^aR1u*81}p$RgMFtyt^#@l zC(~A0l;Q{jSuDIY_k9~0Efy?`f>SyokCikO`cqIzOdTAlL0vlP{D`tB z7)^L(=;pPuN?773tG}p3C7xiTJO5sK)7>b)?;LzBjiEDneUp9ey%x3Hs3c?Lo}v+C z)6Oa%evY&$#@^I(+xK0F?HLpZv(bg)O-t{~0VjD&kX4&54gIz}4(qGhxSTjiX#m?z z?TcWt2T4r((a^GP6hmV7VuZq*W%j1*5l9j`$v)V%g+bX{Gg2Nf3JOS3wYkTD`t^?z{Y4M7S>R5IWU5u_;=&p zhjMSLJlNYL1me5#%;)L98+SIo8@tbyCf%xTZ|}P?^E{{*u>w2au%2H7$q6&>tiLXG zce3YyuCG~4ZR<0N37geh{t&`lszf~B|5*JEBFq`O4(g>+S zxqe+=FD<<<*?g^%Vvxeu^O~$Q%*AeOveA% zJe!QnwOdFGwS-E~ye@yPuLtGQlFGDB|I=J2$m6r;ZF3!t&u$I*I+!RMp>F7!OyR;7 zGo;bIGWPfJ)ldDlZI(>FbvlSdBa#I_Do;wwKLk0%9qSs{n);(w>dy!TV%H|#%5iuH z6+~j?U~eQG=%!+6wTp|)h*DYCKfs!W?2-n~L>fTE-y`m`S$2Hk;s*5yMP6u%)k{(N z<13zxML2}mdvJ^4OnWfwgfp-#<4nPoXg3_h=x*V0&=^<~JR!jmqzN+?oU&Yi>7tU8;G)ol_{KeRQxxJw;}Dq|Y>jtjWHf?v zf~C|bi-u66Fm%x(o6e0I^OGbO@=FYmPt9tR zcMimNpm5{Ocsgu6TZb?Mbo;_udA>*=*dwQE#V@54q>%2&g6x95)uP1MN9;_FsJMn$=2VAk$y!9G zid%L*;IDFJi>}<{d1=>P#iKAFrlT{*tht-YE%HZjA65>ah5pcz_h5L$TlIs5QMsTI z7pQS2_ki7kN!{7$tPP4@8PbKoCO0kJH(*kVoyEmFUg(_NtWP|Iax~L0erLe8q|N8L zLYM->imjomq6pIr3v%56k;sjMb1QICql!HxG7}5}$;mYGstt0p8YgnsHdR$gjlkLh z?4iX65M=cG+WEIIClRGb5F{WilL;N8AdLCe@8S;>t`)APhnV_6t8&bL2NP760W-*v zQn?CoidRptWS-?WQi!_#VwdPwaPrB#*=S9$&5@m57o)fdf?`NTIZ}N4b1r@){{_0? z%*)un;9=5uuA7=a=GLBS?_+23e}~Qti!eMGw(jj*4^!PF!A2F=!}LN$oq8Z|z>6LMG~?AT4{k9Ab|AH>d@-y|*2S2)9zXNwHMxo3;0*#I*O_ zPK4z7044%za1)0r^mlQ-iS2UOKl;G8IK82j?uH|1N)7w5z#!_@qe1c8V}Os{RewYX z+nDd%vjy=4{~1-Wwy1hvEf??|!t92)pbtl%S_@Ex`8Im3<+ax1`;ze9k74tS1$-o7 zE!zxciABR=gmJcWKNMm$e=l{iLV4YPDVeX3J6;lXC&(gOqYJZ>?I^xN;TEbuC>9ms z)Xf)YZLQTU&cVe+Z$vDgnq!&Oo4X9RUTho>^x|7B+J`uZdoZuBw>gA#+uKiyh%@4h zUNysfO-f;`u$hI9v_At8U=GPX@VR@O-ziM$Ru&lm$cAI zN9bl~@Dkv=pWlD2RhPZHbu#CDPVzj`yLRomtXj41wQ9VvV`(#q0ukxbbqlh24vt4$ zXn?6R6{NIi1R5O=4-dI@Y41&kyHp5wGVM^2Cr#jkmAV{c>8DZeTqve!nubJ51>{z; z92HWBp$fn@X7v-ZGCZk-nV&`;{neW4CVkDD>74HgDE7J?xB6Zeg0{O+e4CXe35{j9 z=d=<;H#Q5h6vnz*&4Bm@cvL@!6bNXn)OHW4p5m{G@OV7+4$dJzJ8w)%lhaSuBS%PY zMm7`5(x7B9sUFjiz%v!cR3hRw+L5hQpBsuX z_NTr(>nu2C&U1o^?u zJ-HW&?F8u=ZuX#9WrW0rO{-ajZ=`O9<5FP~MTdmTmRB{mB?@W!kIwR;f{sgd@L}0r zbZs1xpRGOpNIpPsQY9PrC;D1HHR`$&--8-RcAX;vJ1qR7(=!!a&@k;FX#xztu8Q0$ zSDY!m5|B}P52j1|vJ~jXgI;IHOp7k%>26W*mv|u5VuSQ#?83OU&Sxme*ayxb>SXEh ztEy9XfwZ-H{hxaBZe+tw{kS+59bu5yF9I4w+nLoC0I0k9#Dt(EQX7~Jf{?aXo{%(> zMmOE_+)rrrmpJ87?a+)+jaVQX;FdNeLQ1Y2gJP$3-V8s;`{;1C+L+((Qo{Is?Z7$J z!j+(lhy0j}<}2avQa8LqSAuO?JQb*cO$OF1a+ykWtd9L^1CTwBCk@`5D9$DD zz|eE@E?k13X3e$Fq^)n#`HZKfpI6~h#-+R!Oux5YNR(iCrSFC)2v1xGg%V+oo#d;A z_#pIhT@A5h4<^HH^B9XH2vu)bDidVljd9#;d$2*I_R((?B-Ql#`0g!zhH^N!Y8gbA z+ZV@tG{4C*B#A$Zi-3 zE6{>K?+E~BkIL;-Rv+DY1d?gPj;8h?Lx??PV~q|t10sve2;9?7rtr)zgm`Qhyblh2 z*V&7xEy^J^g{mBquf}D$ivYCA{J?-?-(vr!`rO z@GD*mwR4#u`|xcqcfPr98gBU5N*kg1MqM56Ep@ef{#s2R@2*e2e9{=8zwF$)y}!Re zp6HXw_;nhiBf9k*FBT6_;6}&mY1rclD!5r1``VO^hQ|}`G_!Y|TaP9S@q6KwPE+{z zf4AT$>@~9=Pr20wiqyH4YK|wTyONMnZES@}bFi-+U@@-Cb>Cv9_kfV-11GayWW=l4 zYJsJdl_Ic|Eg&Sfr1qYMv)`GFACz6y^9`#~->V*8w99s}nyeZyjzTBdsr=`V@U*gF z7EiBSav>B-K_%9rI;sM)M-;ncRjZ?|q$ zsxG`%9srjJ50X(=jcOZlrS;n!>IgK2Y1UW07NQ%1O<)o%i-uTR&WgU6fa$wa&Lstx=N?`n_PtrRMt_`Y@qDYW&^D5^ zbzQ(jCsaqG#*Hl)nCs0vv9ZZ!k(%OXaRoxtpc&i&SrWcbQakOOe6b*u%dEQZ_eN+F z)zvs)j<+hUs*lG>l*w}qK>Emjwvn}(`K!GVX!u`t_fLc8-e4T+eY@jL&8TH*n2ZGB zdYTE{uo( z1a-JRn_qLb;_;wnEKEk|Xz}ad8?*a3to;372bN>ITb5(<`X&M0PlraD@~qQd@W~u7 zMs2ZQ4>eZT_Iv>~`!aQr=>|>5*idaq2Pm|`sJ^~CXU7`x%)7se5=o4{P0a0s>=}nf z;BL(g<#I}yu&hJr9)Q$un%ku{)bv#Y5bfl|R_4^`Ce_@}4TOvP+2NA0pgA8@{`TEG zgi!D^>ZVb|F$B0nsarb;OkOa?)^sq(m79{LJbGFKaWZH_lDH*+HwK@CmnhA8rzACt z6lJNrj@uS(BL*}pi{{0Jb-`R31PAz|eA9%tH(Mb=IR1-mKpY3a?}&-f4#kSRsBzU$tq0 z#$qWGaIcu9I!ri5<>M%fGmfa8tsE}%roE8~7res3sQ7NcY9dR3GJ`HaX`sroo~$c^ zNC6Qg>mfcE&hj=`S%Auy(FsBnZ7J-;Ad5_s{Rw)RL8Zk}4t2^hxGRd>D)Ylb5|k=Z zZGrWO_?*kfrlGqz9E!m#0{?vMvLFcW)SsW`3bO7iYUe(p#AQEDiH0RTnR{NyS8Oy^ zwgfxKo9&_<9~J?9vX&MKX+t!yQC{XG702#>^r2c3g`H%J@;hk&10-XDa?ALZN9j8-K>sr+6>W4rLY12vbCWJx7Fo> ziFu2FJH5VgC6RF{gK9lgv7!~av%46c`B=n3ST=8YeQl$4DNYfnWqCvLoSG8rrpsqt zsbEy8&=^`I;wQ5mX)>9C2&HYZ=wZoYByz)|mqFL`vxHQ&1A}cEiMrN0rgo*ae$`nz z-ik|&7s)rv&qlYHOCltIH)@#zLZ=j9 z_{mbtCb)SYt`bI-fE#ZzRni;rGR^lg)A?GvP7C1{MNt8nq6#61k1*PbTJQ?ZZmCn1 zI!{$cO9&fgjoKz$6xX+Fpx7TIgjCG0sh0p2QHQs(5kTE1%3JNSofT0a^_rFJxb+)# z+j%-mVLeczt5iweUD}ft7zcE#pv~BnCQyAmg4r4$iOzeX75nM=+3Z!u)}ju|PVBu0 zW(9xQ8*T2q=1+c6C)H%*XP6c(( zsZ?zUQ8&3GD6P<3PnFP+Y#ej}Pm>i3Y!Df4M*4~2(W5(w78jALJLwdWZa0Bu)9#>H zfl}PH0uzWekaYtbc?i<@+!+?;_V)SdI7#NzgHJ*~Dv|7pgxdOl_)hfq!-yz0mhG|P z=+rylrLD)j!k|L#z?Y;H+tMF0#e{;H)PaV-{)vp%u>+-dJNJ40^wg>?lfL z>7-@=isgWp%AF%fV?;4O;2c=XYG&SomeAm%LTF%wZg6#23lG%2a%#^Xm}G>HV9xvx zqOwR!7A74A8 ziN!=Mw393dV0&_`m}w7qP~@02)~6$+tZOs2o3bodPzC=Nz+CTiPSH{`7xz?UNS5a3vG%}P<} zF}FLz1Cm4##ztG(-+9Jb>W|gsdVx7O6OLfpDjC6=SnS0W8Yg6`k!%((#DU4`@0_-- z>Xwhx$X~%oZ;GvwZL&tBUO#ZvVv#M)E}UfjsyI#)D;h3~=ra4}jG`wu z9f>-c4lwoJu=8l<$pA-Ck)rh6hUV0uY{?YyWh5?aP^MF~(-Akd3qKPg8rrVs)IcvV zr|um%X+aeBMw?|dK=bZ~d}<3TXP}+%4k_6ZcGxu`<(1@cco->J*gt%>Ls|gk6Rkhj z<%?cCwQ?JQA01~oQd->dYO56XGzJXcy~qx!O7XKw5t-x;$g((=04X+Q0G$PcNLg*1 zu|$wY|8?*tQ#dPjS=>S&AhPHMma4QqZ!+g*%j(<|!E(wKyAZ7|9Gy+MVraN9Sjgx1 zPY(vCgnQ^($7xkwZn`!Rg^^|Tf3s<(G6rWuw-bHLK&vh>qIt?v(c(57Bw_Iknrt0^ z6F+4Qo1YOnGE=i@2Wwilz=DWaOFvSoI>dxHG|P!FJ3cYmPY!`AaBZ`EIRQ-a;#Nwk zp#hVHt!2W1IVrrr)q7w4mhwo5B4P9<cn{3 z31Hr3$a6W24$On=b*X1tvo;B~ai`*%q!AP8T>Jo{jTv9==Nqi{9UldfA_>-bo_tatFr~u9^CBp4#hk#@x>6 z_Bob6Ng;9Xbqqi~e}D3VL>s8^Yzn(Q4xzMM8^^iw1mGP)&NP85oDdg>$@d*`$em;7 zqkRs}YZd825pg>tAy9P+Gc+2XF+&mwk-dP)>pO^;uaXYM3(^`?y(sk-ytn{jMMF+( zIV%%d&9uw*4$sg^XqB~OdvYMZZZ$!~Xf-JSINPh|mD0*&hiXwa>6hN?oPNP`mZq+^R+>>b=`^L~Lw4WGm}d11?R8gdNvx z{>+>Y7089Y5Zv1Hc*;*^%`G+3j*LB})F81=1uEbGp_<6;WW6Xi z9|$>}w)^lE!hUB6?HNLwR8*2Rf|sOH(HhZcxCE3)BWLVW;)hDOI+&at?mxtC?-CZL zwcwVUiJr#H*aUDFwNfHyJKeq)duvts_;r@&ocXlIqq|r3)VL(A3>Qh@Rx+i%gVS=w&V|I0@5fB~GHics;`nw`ow18h5b4 z$%v))Qb?3m&7+`<*N1WEv4M?mAaI;j4Zwk{u7Ky)f$p?1$M}IBIS?Rl}p8P*9(YnCdqojPq(@!_JtiRY!}p#d&xgf z4iLg9j1IumkXY>=&w|8nW{lh?v z5KDuEOUc}3d(+N<(xjgq^e<(Jie4;Z5!0q53#=}DCi50yr73%aRYtF(ayAWnJBnu3 zAvbylCzbrV4HXN5faX|V=^R6@gdNSyZ(W4-`e*~yn+k0Cf;X+o-`Y6{eG#rZhrVfa znOHJjBf}=Ox7GoP&DY^mfVSow)c!LXoJyXPnNMcKJj^sEmD;e*Bn|HT$1$lPfa2L&NchE!=Z5fhYPF>T`-Fx0lks>dmz)+`C#c3XjM+byp4 zf?{~d>_EJ8^BIIyz8VPD1vhKtape3bf2D1!gRwu37&+N-_&2t%kiqV%mA!63?8Hf@! z0ugx6f~331RgxWo4nT>}I{M8x;0zDsuA)TaK!FbWkbfx|K@_H=U(NArN0S;*YiYwl zuQv0w4`aGR5;ECTaV3h4QF(^aW)?&pr=D<8D(3VN-jq2$*GZTStAwSf-&)WG*5bgF zw)q8>FYUf2`HygsN&H30G%{z_&!qedE-&Su3AdsvE#WOfD_uhy5rt|DPL*tEfV9$r z@}#n;ZuucVrd*)p-&hNvcs7|P4Gni!tk@jX#1w(b#%`Ng0F}l50~$3A*8VGR(h8}R zip~C2QtwHLGu4jNYkxHS3DRZT%7<)2v%LgmWS9|PV>LW^bl2lqL?XgRCo!%>-{cKl z%^;W6o80y$^p5OdFo{HRr1$nPT(P1YeL5!yPK_ZK5 zdm=At%N>j{?WVA~^t&ekFn+@AT<7m}cBy;WdGUMKjRc4Y8b=ZuLpU%D5P6!BIPo>~ zb#7{%mjE?x@&Guu*v5wE2z>4^hX#UU3icQLY!MLM0(ydnzMq`fwVZ0;TrEtW;AX}q zj|qY4K`AMWG0IA!!JAwYz^eorSVJRfsF!mE`PniO(X_*eW_Yr2R(2xn7nv7JJCZe_ z?42ucS$t6K`92PVFJyrxSjccNTGiwtY`npiQ1?`lFG;9UFR@3xUQm{{ltj1Gp4%nX zbS-yJ7HSR1lT!K6r}se}94qii+ufRT-mO|lI~JP=`(w_fVya1-tLS>{XF7LeFw0W1 zSVe4(0+_5LeeL)WTu`k=R=S>!Q(ODwv_et8ed>Y3G;W{yscRdk0G5%&W|9}GHY7Up zM_QqJp@-@OX~oMj*+B>ZN5#r{(dPKN1FzL*W6f+`8zHc~2}r5>#yBr0LD*yO2Y+f08UG!essl$#!P* zqH-oXq|rN(sDDfIHBYejh>k$DVqu;qTZKU95}}4D^H+`mGJ=$y_*2U!Lj;gyIy0%l z#Ijgs0#yU)5ge$-q*_9NLRd2z#AO;LfmRYrd*ef2t%}dgWu>5zknV42G3~D;%lfXW zUO=2RnE$l!s?%IVmCV66N}KrRV-qQnPJUTM#Iv?yUJ!84@p0Kb&q?Kr4ec{9iW>Qi z-NhTsQVg(>Jg+om923dF=s9S>xDqTvjG%i-lDw$BXFaV$vBfdu#Dx+1z`iw1^q2^h zEylWlZQ%lgxI(J!GAdr5jlBXkF^Q_~czvv~wivsbv{oQfFc&Tw=Ie|EhQi4*0ELc* z?y8}r#f2bc4f(gNXbTFn4S){p2%=Xk1lH@=R#cECjXma%X2w0eN!U#8<1#*9N+?ez-5aGrv!V zTB1q{Nomx@yAA;oYn;@&Qch38Wps0l;tE&tK>OACtNSC z25#Fn#gK}qS1i`se^5p4G^QLW2bv%21WIEt7}-}s{ONGL8+;^LE4wrGjK=%ajbFIa z7JGZblNKhlG1Vrcs3AiaXkG!3p@(LYU;7WAa?X8IJ|LJZM6QOam6%GR^QVRDn{@2kMKq05p{V`R~g=OtFo0m;bJeEd0iXqYNuvi;RwPw_HKfuyA1? zW?WVwa)|hnt}*V>gDQ#uv9zobrl90=RS*FUi9jif4lH5*q)pHCzWbIRQwKznM)}`- zk~Ak~ee1k25Z$q>mZ}vsXB1^+Nl|Kw6uQYB+6XYX_Be5Zs2AThx?o|TRlJKmVd?LU zwPJBD4Og_>obDzLhN~Xt5SIspaSmBroy|dw-@TWeSVU7?Sq>D}KKWsm66m_W>k>Vg zzCa0?7UI6=)DL`FcEad2Rf=l4Ywv_dB+Xwe<%UIkW@e$?=wfj5lxL)?5U|UaU5=+g zN@lrHI*Ml572J7cKU-^3v^3k&&L$!x(A-d9nul7~={FFDK%%iKQnxzJC!rAW)d6{&{<3SNpPM=<3af$vjoS-WJXn%`K2D2j|_kujTS z1VJOGsRXFH1`WAkry2bWas#(8EHdDjcTf}rsJ3JwFPs|!>|4LuFNGGQ6SlUa0{&}) zKh2dm$Q0dN!QWGovK0Xlb<;$Y^g2L0CVV6ESY{lkbyypO82}qTOWWM7C5_|_vw$?9 ziFf7!aGY%>f1WG=qTFR0r{Q`UVc8B|PWC^9K`sQHWDKBnF)6mdyoh)$4{z%TdoB+} z{y1KaqkW1Je zlr+V_2--I=$L*C3LYcf{8p(_yQ8r=YYi0yyTV)*tytaU7#1(4|T+h0UgDeIrvCqGbKnG-Lic+WwVl{D4(zy(SK)Iw2F5}I1TmDmv zpvUxDfr>t92DM47&G@^mx5?0vFb4cM7}(wR8sL^C1dl;Qgt|!rFh$}Q!8MpdtzEmc z)I~4A4%vJMZgqti=$ zx)mkJ!UyFu2mwREjrt8klHQ{m%7BDF`JD8)35Q0v)AwQS!uAR3Y9`fZ>Q|T(3@Ahb z6Ea$#V~LX>60wLDu9id;<@h!8l*OprHP0!wKk43~$fCl+)~k#(p;yYh-#AascruE> zS=WKA&uP8Os|xo8^2srl#H1{ynWR0y^DN1cU=>8{u}2zM&P8-Ok1vg}gTi2dZ2_kv zx>Or{;Al?7;znNH~B;$r4-=B8vWzeM6;If2P)vd?r_@Kc5?G7!Y4 z+0w~m7_oaxx{ycgA}H1PD!giA%Mz>p{`8(F`;3dG^#y}zR^vqToI9!6vrJyp2PM3n zBfw~J{E9ZOW5#K}A4Dxm&Igi_e4iZi9rfbS`IYVxe zw&PA2yHnXP`{M(0?@!K{46NKX<$VKUH#;c8^fKA4X5Lw>Q>vMG|7e=b0O5`;$5~RU zmvl!CC}+cL$}E>*c}US03?>;LEa25==CjF|+>;xlYr`B(QTW-?z9~oKfa-uYVW=}J(>z?9{ zq^8aR-J%QjSDg%42Bs`?#AgH{x`5`!@nnDUjp=1c@QU5)g+A^Q8HzZQAJn41Pk@$0 zm45q4S+DTd6WpeB%=GTk3bww~NxBILdkd!e6X0!pBNJwmKN4|fa|YM5B>|GI75KM1 zcsFaqGP;-3y*c$N<0gSAKM?Xt?v%u8-9Jrde9qMxyZ|b2k_hSSNc$^~DZ-Q7HiQ&Z zl6ZZG<%>-;4}`H$_Y(SX145{K{q(+-`<)u78W8*F&;qm+bq#-EVeGNdE&8_=nmFRN zS!q4ix3%pp*m)d4J*R~7d(ToB1=X~iVisrX|hlRf(0qnk16yhLVGf>C` zPIGZLuVE(zfPW5&cs;sIKG?uuO`bI}L~Y=UjIr%cC)P`UGVd<$T@bM6Ez#XdQIR(IIK{%rnqtaq zA}LCx6XDMKE;$(*8mM~@Ov`X-PV#bdzj_r90jhQ)OMCU2YwASt<0$1c?86473d zuvsboK!1u^(d*%=B9}yr$&trWooly%hAf`ncFaO%w^Y~S_z=kEyh;c-CRH{`Wj41) zik{Uzd};CM|Dj#He5ABWrq6}na2n|{5rc$LST0V8{NW{)oF%YTq(uI1cg)3-K0!J+ zKsbMBCd(3k$aJnYMj-zh4FwllXY5SEQ$}rwP$I)CX4AjTKiVUFu*>iEz^r^Y?f>zQ19BcYxAp{A9Q9w ztwwMeEqMzwH4#i3!&=j@W@@$CYYb|pvb$zyq10-m3~CM(kobh~6%e^`vUU7dO!Bc# zJ~buUI1PPG2aH^d*Ye5UTHib-n)5)SQVemTi zfM#@O$J^1>CWNlTuBGC8+GWM2cL%>v0P`RHg&vEyTXMFRuuXgkwlr!{*}&Rvani zvJaSHw&8st=ujlA0Z_xn8V4@Nt%CAufOu44p_}akmcP)rf9sz*g6O(C5zrn9zMZwW zwF(q5lHFyv2wROoNrtu~Db=vL=Zz|J#?5TK^Z~Mg8f=7>*lb#+3*e|j!FImUm*aA; z;Fu3Dz)=(BA9UNV^UaDVf1JJ=17G3Z_EUl*d#9sQU6{3{%%cnFpPk;p>Cqt)*~YEk z?NU6$PeuLJsCmilc=|BP?e}Hp*5cpRR&Rd&b>#d1-AQmli*dR+v)YbygHX#X)v1(a z%PjO!oQIN|cu~9{FhTZ{LevbRnd`Jna)!(KC9wpPclVBtPd_*c*jqZamBM)?gQqMK zge=`1z8Y{dDy>sCbInX(Wm28%EAkK+SR@HEueg8a)rj38+!FcN8?7@{-DT{#BNgn{ zbs5YPkB+NzW>6O@%8U~B6G+~V|N9nc<@K~0*Zw384eSSvG(e5mV?&+UN(}voq2?8$ z2-O{HF~5=bo5NQ+_{93m|0dho);MAe)3HMWBb}oVjA&5eh2&GFpI1)Hs=&9n7}NV( z*9VN5iZV<{W#y+^B9gcPhsTpl@n7T)}=C4u=tp2bi1B4K?gI~{?P_ju$qx-m80aE2I}Y~cUXGxRpXmP z5u@Mu%+e3|J&xK9Ps(|BIKk`b(i2WqayIOhX3nMW-Tsg17yXd0z$T~V-WsoGPTPnF za1&ay*Bl_Md&W7=SU@v>l-(ZPBj4vu34}iS&1-`wkO)({VI#Q{a8iINi8RcPv5KiC zUqNGt;y?_u$uQ1^Rh(XIzgX8nOl~wc>%DHtgWWlbn$`_S5s-qrBl5Fo^)*w9PKZ*W zhq)g*AXlRlI;czH;Qn=8LxgrAq?j~qphTl8a)Pcsq|5{bhS%oC<{-ATj4~$prA)DN zx?P)4`wQRS&P(hYOSW9TDO$_Xx*zfK`9-lqBR+82%ux-iZr%{$E(X_7J@{w#rfm z)j?8F29s{twnQl(l@g%c1hZJ)4#m^Jf$VEeTG>N3LpI!;W?Rqx?fPJMEo=SM=1+4_ z8Cq=Sd4(P@5Z{Y)BL;|l=4~PoS(lox=cnSRn^hUhS@z7`_Qhnr3%3}z|kTaHZF z0FspB-#Lzy%s4Vj@Wz1+cq$z&#G=Cw(2ab?NZML}}9_`Vd-(vsShTm>H+IOola@Y-TK8S@Np+H&pf z?QcXZ0IBvi&~0i~-^B}eiuC7ZJ~ zXzepwo-(hrhJ01Q%ziGNhxq)|(nj>rf3)4J4SzIfsWsNOj6!pCVxW{oTQ^Q;k}7_T z?ClCpV`65zvgDn6)2U+CxMw*cwEBaW)5+o4>2Q5P!A&b)>%Zgo>kAg%R31GVN_j5U z7mh)A2QUf_lAAuxxT=SX(hhAR(YXvCj3HHcRG+@gvO_QCi%F>jTd7y zSi9w2KkpBYMv4Wu@?R~nDi5a&eEVcDo)TSh#8Ep1nTVFZ94%Phxh@NADN60UEW0f~ zSjWf@rXWyDEp5>cqN`j}X6gcN{y|(^Eo?bdQdY}<=uut>7f|?E9uK%$5INGBC;#Cp zgWZBG3==1CdMafol|Ti!Y`iYBN9sl%)m*PIz~AOiGE=Vk z#39I9&1E-5!KJ5O+s<~gIgWR z7rw#VarX(Q0st0iX+{8;xUNR#m2W6gUPqhVBDiHzkOG~wCm|{RR{FBUBUUMC@LLHi zb}}7p-bl`jQct_c8icbeCMQ=3&w&N|GqB2vnk)DGo;Z)_G2YvVq}w5T2G;(rqpz=| z=!#7ABCjorHe^MmMjs=PPbh`IM8`J^J@{7xvxEYC*2XZAbhAs_otp)$wrK9aZ)%+) z+X>l{>@8SIv|zDwFsB(Q8{E|Sg<@QeU?|udOA-M-oOr0ALSao8rHC~a)6LgzFli0f z*K=ZaG8tydjE8$o6(GobT-c)7LrBc9?F2Vy4%>io<)zpHQ(g}C-Xz9HW={{UwWEYW z9FLNvdPYEBN+lipkrZZxqdrS8Jf@bq9p07Ttf z&I_Eg{dPP}P3JQ5{PsInJ@M_OCwgSdVQsw?0Yi0L^Yf1i>XCXPrg_U@ma>oMtfflt zWbQhp+HuRs&K;ez$3Tn|PnI|nbtS}jEEfmdcqL4=zHbKrwb6~?(n!~(i{N5&6K{sxt`4W}Q+!Ya(zSbx!ZKAjv z>pjZ|(#i;W8U{VuKz*OsS+jLJhQxbltHG5`a%V&~z4ZqTv-wubwWxfuG?xKcyLm6M zuf;qWshMdJFl@u*IVX14q~!rMN#j6($}n^fGdBwKuhF{0ViQNSUb|-`r$5|1QX1&q zxk)VjJ0o`Jza#{)jTvZl4MaQSOoz$f7a$(N5ee=Xu-G9D=?6n$b%VGVRC638P}C4$ z2!6+SJ(L&=Mw5SyghCl~PU+1$YvIIU{?J&M05zou&nR)w-VlxuH%)Hzb_ncyX|Tzv zvzQM0N25;%TxtQS31M^z>V7T^LYJ~>%-(<=Z&x(Qa*?`dJ>M*-G+(Js@X12CC%pld z*>(YHvq|n|uUo6^y#;PQ2M5_q{DM>6z^5A8P4<-Vl%)i-sFx8=i>njd{1YZJO+M8Z zFiTaFU~^>L7^lkc)o4tTeh+urJ><%*p>B@v{e}e7c<=EOm^Vb6rk&m{zPP%Ayw1DH zjs8RPYxz=kwakR?vFz1ndF|bF-{~Dq8t=_!xSMo$ye1#{Jao=)IfqlVZl$}@;ZaN8 z(fFY8noS^?!IXIdVcE>=$sd|cP{&#JuCWY8(0mU(Oy%M3ki)Yh0p_=61sAz8WWH~| z#f#29Bz;#N3jU&Ir6z;!^oDzy2J(}u3IE*Rcs5vC+CJ?4x(|0dU&_+mh`4L0W$@YU zLqxZUCqg3Z&(jb5y5BgXvUxh9p>99kI(qO~YLdV@FS|B4+TRT9+364&Nn-wKhx~!i z|D_R%i#PxJaPo3+xQz(g?533WN8m2{;441m!)yDa0lLiTXm6@B(9BU2OWjkUd*0!| z{esdpkkH8tX{V!&N3fwK{&|EwYIKOHW$Dgj0!o6U6uE-;&5g}RVi>Z4_6Owkl}B@J zv$NA#rp_M|+yzkA<<1M@Q|0^UTtBqvegxd1v_vC+RMAOJ|4x8hT`IS~?o{PRCkH_}!7Rf-~^bF=w2*=X|yt zpIly*bw=$`pROe6MbTw%977e0VlewQ+SC`I{%(Z)aN?E5!*>f$xl|O0a47dr#S~5jm&(Gq1{yz%_BCG}Cq`f=vf3ag_U47hjX zr2hmD$;OG7#Ez46%=qh0&zbB;j!H*0Gu{=z`<1%p|;yQ)F2 zeMQCFcML>dtXiEfzl3($M>oE>qbhe9HP!9Y&l%$@@9rjFuC9H318byranGReC4;+t z^EOSb-MwkExT$g7_>zhTUhxJ^-Prn)f!^4;0|XZL~sSj9AJ(E8et=qBynzWFs30gFmL|4e}TV)biWj8uPr-{x@N=KTeDvwGvE zjqP))F;0W$8Z(?YoY%f!%w)Htqt!Kye-ha7`F(yHcC6mGLHTi1p)r6|Jw(x<)(@O@N?#JV&C7;02q>gZ$rB6u%HX#7M{PqYa{=Rf0?)e>nk;V z<15zi)W`58Uoco}=_^~wFIh?8$vSa9T0pqRuRm4$_RSkWCg$-KKMl!g&ieksI{Rvi z;z0E;nZY}K2zoFiD_vc?V}Sge+H3dj0~l+XVnd)CHoninJr-Fgee+AcJn)XzzW$=) zS5jz?KQg^@JM<%{-S$YtPy8eAYX0inVU%JYa;2wu# zBmgm+D`F&#Q6fyhPkb3~-3C_q>55&+`axGOF``4#w)RiQy}ij1k~F^&7mP<7BlDd0 zucCfpj?>BxVv+P4Si>p67e>-!2&|oo8Pa!#4xD>;v7z^810Op7(^(#q=yi)0LXZXb@1(~m!lgpvneKKMYFlNmJ5hs3i8C|nH z%`mfcG18aKNeyhFG%=>fk|;7Q9BZdznT^0Dn<>*`V5eL)@uzh2C-!@TsWAsFO@cf^ z9YeB!GbY3&x(H@*nFdg&_QtJ0({@|Q-?Zdz(6%&76>?w68Q6hIs2>%pX>|%YVJsxg{*}fml?^P25`BT*KQMv!bzTR<<^P z4N=Z;aWhY5sS7U0AeOqs0;F|iC0AL*Z%)Vj%eDg>ZMlxeLLVo1)15zkhcj{Zb#%?_ z!BFjw-dP&62Ao=cVpuASLHv9|TS{1PMH8`K7Z;Qf?q?yjn#oqfJQC(>0ydVNYFKHT>H4ej z>(hgI^#gj!@PmEFwXMYDMYrFMg-72%ef&u6!}IK?t3;z$A1WvqtrPFDj1+lK{b5+g zI2vwP@(vs=%)Tf&eH#EI&j` zv^n?r<(>5ZgnvQEor7%$u~)VzNRrqmRLDjq;lWh$9S1<6`|Pe&81grn{_v2vGc-oK zIjf88vtVWSKn!Nvddo-4>(jpu<(hf5vCBcigrfz2A`hyT|Q@fSw|wjisG zSRo$ zuo_%EJvf%}pUa>&rdIS?W?!Ppe#C6>(mqQi;OcZ^P!~;3HYV|W`edNMrt!wM6^wEO z*T&Ea;Qmi>Bo4=W!;J$g$uc{Fw?>zD)^vN48aw9PgV`y=KK%sKF)6G+Akg$WySu~b zkCXi~WkDk}h=hbW#LRpz4_=u$^yfiucqUd|%%P|318_1-lRppUm_vtWrEqh2b}bB> z8^{6wtx@!aI!lJsy0gun2iLX^N5?NGgOmO5pGMoGnKDeDOd?yMGE=BZ6!n9#_591P zzU=4X@d&#fX1kW9bc$_ti5KTsZFPvNe2`l{9pjZZAY!mXmc4QFYcs|1>3C_tzTLOt z&u)T!nBA;+pW*{6{%Y-JS7s_JK46!m5n+6i%zS=&@*y#{9MU&@Kiu1z932ffJ4qc* zu}e!3>BthorDlooDm7v;$mM&BEYprNRML3X*O1HX*;8^rw3iI3Otlc<1#qg6}ytHeE zHab|^a#=(fHVcmk@*ItuWyu|~(Mhq4rInqBqshg_9F2_!XCyi+N?|G^9grpiO=sAd`p~B>t z1bgCc?uJ1o_yxSc7E$%*ow2ex^*~}D(DGcivqlD!u&8d zlg1Nd2h7XKrZ=f@Uo+H{k!U`B2>i;9MTDYK`-QUnI6L8lDy91O80Y9a(5mx-XpzVc zs?O{>i#W1~grH$`bH@=1s_t39yq$Ulc!HkUUxwqdlaQ*kp*#QQrH=GmKNub=zxu*T zTnXKt^V1JUFDLRoC8*;@3UK%z{PluPbQ}mHL{t;lPJ09icjBA7ei7Wr6UqB&*+g5i8LFz z40b;ckyc;yu}6S~tdTs9a99?E=ZtinJz;bIj}bVmS{dymMrdW}VtCqfK~U64^5gfK zlz+Ln7!RV4mfd7Qg7CeQ6I7?aN7my7OSI2XXwUWATadGDI66HTo-BAX3lsgK4Gta9 z!2@;R=p}Jff(+n6$P>-X-o^(q*6k0sfhgtN!e>KM6`K^-kDAETpu1B=LviN)6Jzx$ zcNP#rPDVJNhu0RK;Pqq38g?fW9@|(@A;nF1a-N*>nNJ0HYd}m5HE?D?xiMtHnU}du ztQ&36{+>ZQXSmNMXA6Y6{hdtDXBgL5wFOxL7w|^w2IJ|%J78bWM9|N@l^INb4_Ua~ zds*1jyGMT;ga%sW(f&fvdItkyb?h}vo#+V_eS>($qNgeaW}9!g_!Tq!I;d=;LqV9SH-(YWKiE4k3N*UzyKFrNXrTNX%*Hgn~tkPJS^i2&^y-k;b`X% zVme`-Lv8|xKC>M+8c)QPuZg*`)~`md&%6f5v^s`jgaXkFTZtO)aOvCk*!w;r+cP*S z5+lSP%+Yz=80l=>CKd!@KBQTj4*}vqs0BQ#M7b)XoR?P6zzTqaJ3NGR)htQR#xCbW z`{@}>PD!8$nwmnN{bs+QjW36mnoPuTu#m=%D2SCK4>3hCx!?%fHv?IIZF?s1r9P`5 z)rLVQ*rDcNwl9#D+Jow@W>8aoc4fl3C^1g#m!VV<(DfvN?eVLNi!@w`aA>#b16E^q z*G9Lyiw4iK$Ot;q(OVT|*7qF(d6IZ?yBVdh*Hf2H#5siRLN!x@&EV7(CM5`9#Mt>5FgQxKSF;jFn;_5o z542d|;J~}Gx?ZVxcd;fE+{bhE)SX-wa5>Z2lB)Nx>8D1S1!i|5_CqBUjzu?X)dD(3 zC6vWrG8e};qZIk5!u+BESKQ%`3hRjob~8ltJBg$6j0u;^x)XU5s1&rdW5Jt*i@T=3 zk~JkhbNrW;sE9nYnz$+yxuJ!sL$!*@Hp52%fvO=6sy)30IoXWVEo}CWQQFkL(-OwO zZ-jS7CS7{8WlCjSYc`uieQ>2-!XC^k+h`E_dJws`jK5n~wZ6imFzkph9o8 z;-!sNwq4%#RuJ6kHuTtTfwJcJ6u9X>%SzbUus0UTzNSGMMXuP=G>L~b$X5$A19nk% zM*=@pWaIV^h9?_%>$);^cEDFICn(zxX)x_BFkmwF)tBiNIvU+Z>8HA6@QSc}%`SJi zU0i5BXD5)t(|{zJiw(-xQNkpl3#K2)V2msH+~4#ON(&_Hll<7L7s`LDp`Ik`$WqHM z6(Pymr^BPs>C&??ir(4Y9-JM!$xtd0*2U7DeU2F#688G_@T8A~YXR!{2x6fn-E-+c zz{*dL<0`k zxeWv=r~wC4M-7NB0h?$&n=_iR>Za3991w-qk`WR+E;oR#Cg=iorm}B(> zqZf(DI9{|qtZ;mWxco1TIf-(j-nbhf&q4}gdj=XvOdYj|r(ByGP|l7OEvu|5t>OP~ zDdSG;7Smy0$Se>X8)93GPI4)rl*v$VMiem}M{y-*SeVIh z>YyZcb*9ET_UWi3Q+53GtvNX%7MZfipSWnr8OYUUl0Q@NbYAIXUg5jp%QvIb)|(2qqH{$2=bqQ)_{5P7>Fvk?Vm-d!ys{_y*IH)#E~BT2f6!z_w7Ru zG_q}t$QfZHZwiukLuK|1bel|727WGW={7t2seR}s||K>VkR2daYHyx z&Bv*(^Rr7Jtu-}QV?{W!({KqQQ_&FiYM~xb_AB>*%az;u2jnRVau~OM9ARbQuvQ#I-CxL? z6UA4b4-&+dZnJ61_uIul_H>9~SiW?N4W^pGf352zz{#?@tXg( z^-s(L@^_gAvrsQqnh8`o(|!2|3oosiv(e49oAn+;N=O+&IdoJuv@j}2p>j!xR6V`- z@ZQ#Tr%Q2CKa8EbpD%~zw7z=q=*d5~A!@DS?R&p%-~RdD?Ktj_OhJW)$)b2zh-@KH ziT4;6i%Fxrx2S7-Eh4$pg=na1)`(0CB1(*66N-aaD*V8j4RtB`d6r7ccDg8iX68Wd z*KQ3{>LHTQkc(qwg%*9LPC&?PCqy>P)zcK`kXOwOw?0&2nl%H>M%!k~dzfl@5bS2v zI~5`b`Nv08VqGXoj0oK(NIlY7C99plMhV0CI67b^gLP!iwsAfgm&(NU42YNu7Qh@` z<5dKVUfpeMX1oS7`H5@HTxr1n(j&{Z*Wk|A(J*7r%H=_J`osIKQ zT5yi%laeF*K(S0g)McV1j|au;E9Vi;OZ8JA|pF_{@h%wk4fhU!0lH%^`T26KVlnq_GTLF>{( z29xY-n$h@BNN{krG(N%I}Fpxe>`iH zKTOkpbH;T{r?8gCq?dk0dUmUQGVLjjcZsOR-}tG7?2;rEx#{Ei=cM;$zdw348lF61g#*ARd!kt|XRCjD*s}w_1)?7YJwn0L z)Lu{G>06H=o%oEmQ?bXF`S^aI&=biw<~2I(DY(MAJ38ZcILNGEyvGJ1oXsA7AP^X9 zr9V8J+V!NG)GuR9X(uB~oYGqVZwI}%qv1PQ+^mVW19PZ4VD6m-mi|JB9pP-8-sgue zJgETq?V)tNU-@a#biLOD!tOx1PVdo_=-e@1P>~8RdJjn=Y{R1&ezI1a{oEs>q=`B* z`)!bQ#|OnB(}}VZ3ZR_HqUp)diN-hBb=b$cd2T;I@#OUVF!ab&<{2@SPf-i1K&HN zE>Zr80X;jh`~ewmn>rvRl}*yKPDyr~=j$wRzsU4g$M!k=YlIpu3sB-R?Be-IGni$9_+~_oOn_s|^iwkc*@w8DD*6?;} zV-lgIO&{U4FnOjHM-4NYUR)w z8z54`?6@lF62?EE1LREIw7N+hi`7liWJut~I#n4HkLN;8nK90T zEAV$p1Os{qbB%m4vTXt2*B_h_Def6^+t*)@aMsVuVCLVhRkxDOBx94s#m6~Sll`HK+fsrsK(%T9zNus9K^4&oju8GiC?!LL)I%XC zsOAW2KUxTCmP^DlX=f?6%McW7o<&eOJ@}%HiWEDdS)9W!la2E+M7iIoq(723j4dQo zlI^kNm40FgD5wVqz2U1@h)n(C18~KY*Y)KQJK`p-5YRd=Dt+YJ7CX4c9rCz>;h0~=0u|u z^N~xcma{SuUI9qQU za;a(_gb;2H;3zy@ES6?o`3Ixn{bDx|`$ z-`x=PeCR8XG_UB~)=M$yz9)H91xALPp8*$v7yBgaU;+GtK5BZw_m=}lSKqKc0x(c= zi0pYLgjLT(HM)2wQz8T9OO z3KnlIsTEkz$@DaCj-ql1e;k<3;w)nriI{q-`;h$@GERI^ynWM2Ri%6~-K##~IEfiU zIY5G>-oaO;lOvvI)J0`w#VjBHRMX3)rPvIDcrC|j36jASrs12Ul;mGCQs>W&>G%Mk z7aiUA(t!f1VdwKq?Qn7`F}4A-B^ND4ECoB0-Wh=pyG-N#Sp@?zHy{MSt#_mZ7hTlx ztI>O6G&UvZ7rb)yzqEGL5QnalS`}l%`v!>=-MhYhf-*inZM;ZW<73EJ<3rI)A;rvq zlG34Z8Iyt#I_&KDDnNiqJAH)D3KHFQXW@&BI}T0q{^NgWE;k=_zgZ>fKsy|2%P1() zD3A~l-aHGvRGKj-%H3IjfHl>XxTCjr4Ow{+n?z7NX0x199c)XD=&(}xvKj_Gy&D}K zk^+U0s4ji2kcvP=zwyG?MoHdiHr{&DH@E6r{f02B}@+bk(m2Fbjw?m8YO zYim}kw2Y2B>)PsUCAK=2!>Rr@)=9d=Xs@%55l>(6I?+IVxCClblu`TQq7>M&e5y@} zc2Km73&%Unzu@AolV~Rhz+3i=WXvdA8+2z|Z+6}j==PygzJ95%k%*0d2T{2#SRna8 z>{MJ)l5OpxR6BTh-9no2cyw#1BqAcd8N~OBtZ^=$v>GgFHL;^rXGO%f=WpJLUT138 zl+sbT)Fj7=s}a7>1U@DMi)qWg@CImWBB3rP!@roT$-cI|ULS0vK?E35eNZEGSbo(} zA|x!C86Yai30q~_JJ04c7Siu*k&=n@i@wxjnz>Daoj7>$5`QVS$@F=aB<>6puvDVU5OKR70G&FcfG4qMdj+Yri0x<% zQ*#-m0d9af%65cL*;>%0X3aud0R6FiNjavn=9LW+kA-d3GV3RP7 zf+XaVTGK+{9i}U$Fq2$!EJ~cTpM>pvnIl`Ac`?L{q@m0=!%$&Qy(|24ae*v1Tbsc^ zo*OT01n>a1kVw`KgREuBp)gOsbmJuI<=d=YerTwdKC;*(-5* zb|~7zqbcc$j6q{4;<5t?cOouWMBas+1*&3-3ONr0}zP_huy05LB8jYRXRp z3lO_4?P+^-+3i;k>vVEoozWnFKbYnV389mg1qaq_BxTMUoo0t@K>MH0)VuZ*DG4(fOJLU^E3{Qy6`Wn$@FfO8vM5+*Nq{8w| zG0*Xx`l_!&@V>mn`|5T@$DlLX?2H~yy#4x>U-sjNF#`Y%Ha31EfR`EmHZ~}ccx)HR z$;LS$-gq*;*3`E*XG%gJ?hnR0FUjDxJzCi~9-~M`Ig9WQs3lp(R@RinC6B{@X>3;X zTVq5({s$is3C#ZM5gF&xfS|!3!wOkpG$1Pm1Iu`fIF;jiVcaZMQGzhQ^u@*9gKqEb zn4B&E40A0Ty+XI1FK815nJHNKcI;Tl-w$jgN1E+%64_=%m$PwiiM&cMknQo#GuX)q zrzKVqA3G{IgrmUxazRlRHkMeHIiy9({HCh|y2xy)vwRzO)$#k@LT7o~esyWw)CIl& zjQe_LYV;Pk=7#PeF>G(%h7L1~p?mL9SPh@~Ny#rV=)J$r5!;jrY^piq zl~veah+>&sLGTRu-EOu?9gIC}Gzlj%G$tAb?X&Gy>JdT%>8m75L^a5Irmf&fBCCB^ zPV<$MWEtyQ{5BlBBG!8A;!{xb*8GSv=mk+#)wb1Nw8GWtON@9;0i`Kt7P%mqu;YC) zey80aX(o)^QKJX*nLz>!S?9q*G_X%exQVySn?Nruk^-UX#pq)u@A98U(`?*?jXBeC zA!KHtWj0pfzn_eMmM2kYa~V6QwLdoY;&AvByk~0l&i$05V})N*DQ%`BAZGN#eFDWI)(j$RbIG zwY?eF_-IcWZlZTBlzNYx?Gkjv ze1xQ}G7^+~FpwKnWV1+yl?wNs)%F*BKrF6pfu-we1A&4tmJ4s_f+nuNF0hq&9(?Tm z0dX9P*Akv@GbnJD*cA^aQT$KDm{cAA*07D#9ox4TeD#sewo_*bLJRjAc7C@iOOV%o zCSTNV&V;msq9ig%C4Irs`=LAuSXcaM8+bL0@9!Fr!kOSk+OGRZdhc62QpYhSNwADcBFb?4kjLC9xN09jK_pEsEl zek%vhI#M?_42fgN8kx;?5r}DzPn`K^7HT^e0ForRgr^2x@6C(FDAIP>p@b>{k0~G+ zxD8*}VOF^`aX{dJ69}M0(sLS?`ED~86w7B(=*$u`A26##bsUP{e9OLUO^X1Qmc;UI5J`y_((n;sX8U+CIkkI1=vZ z+iX#mV}#Ynf!OR^R%F=u*xIxg<$YtTxYax8GWzyqsS|-*YJwJ;HTvu?} zh0pgwFAoPFE{NpAdvM+TuEWvt$%qu&m0K_X~Zvo1yO4?89X{BHU%h2(Wn~_RO{m*y)4Rw0YPd9@}jZjm}#*3K|MWyV}6) zbmlA!W3?30nxffo4m7tr&W0B~22SGg0od zDlbZl?^A1P{zG)l??T_UYR^J8-3zS-n=FHK0Je9xj|URe+XP_lp6K%$>KMGFTD`4? zQ0NQH2DKf!QwhqUqZAvqZ)7B5_X?Up8|0N6$2Z8Pdy81(v>psfcn7M*MMR0SVp+&M zo=Q9|E@HSux}^T%B0G{I*;vd8gzaeOMFGlT@I4@<>c;(yeu(7&{5mwbv+47tfrQh5 zNn5BC(CZG-XSSW}2%@$J8>#IeiQphH8_W#8G^kVzAfL3}M+38DGM&AL^@Z_=t*x@lDWAysS)l*Tbf)eZhy*UPhL)Qh7O(XrZ# zF}jS8Xa!Nmv&3u+U~b%WUD|OUWTY0jk1uG(w-m5|e>*H5PU*?Q+WgN7^gvr&$y z1b0BFx^{Y1>_;zUKN_6K+}E%jjrLeR*^cP{gwPiYz*4;g;26T&fkJ{Xo>MRId`lq(!mqT5z;a9A3|hE8D~CHJ)6Ru%x8c)0tps#B1wtYSi!kFB^w@8dSg zF46nu66JyxxkTlGV;~zFuP2-1y*`H$u+`cg#pRmpLl~4PN(wrDwapVO3+{1)z(SOt zLAjre`p--l(CqGc1aL%=OcI!G=5r5gUrJ@C8`@znSFtJg+MjkKx(r?FJCA9`;;?79qq-86~0E~MQY zgH`4_-_Y2x&&E3^#4E=fErRs*cuoWs&==??D*Su0}gRJ_!?|5y;GiF{x zH2U~h)?bfzw#P4)v4`(`H+u1pM_BTbG5PhlY~#JGbN=_+nC+6c9-Fki%hJJ&gjw(Eg}+s$tW{ci^| z^2nPakMIFcY#&1Yx_yp^*rxu}7g(ZFtQcP^POQ6rPn=ds4`_&3OfB**f`aHATc5XW z>EewjKo*L)WNBN@1*4jkEgLG3U??+lO{PTP0(vmI%kBNc98 zT?dfpG*hpKaoarZEBs+JwP1eRrAV-sUJxHeZ3You#6isv4BQA5($S7vW{})_{6Y$= zM7p~Tp_IKM-`WrXPedx2CS8_L6o*Ajz$zO%O3wXjyVEzL<8p)$u@HojdUi4<<9HIT>Fq&a!zQ$XwXTr&L4~{uy{&kx_+&y}m}?UreUNhQ zykUxLQ9AT zlGtc0UPvmv=5QMXnu$WLak`1X@C(p#8cbxkMQ7g{85RY8MCgwRv`}0ZKJ5k;_IMLa zxEK=-S%h*6OqC!Z*L;B*=IpE1%l3E^0TtPkABeQSjMpbd)oA4*_;mHtcF zkGtmpn<)zLYc6SCzT|!zu3V**8^h#+J{ac{-XsnMM?dSYk=%77lPT8R)`X;6EER`; z_e+OL#w7xDpO~PrBI%WKOC;ldPUd`{4*lv<8KTlz^p0nnwBDCV1qrAyP)BcyBM*fy%eF!Amm~bZ*6lZIPHCs%J?#*viz~$$H^() znn0F5RlDyi>+oFUDqcET#3QhGw*+j!b)&aJ#s;E|z1U!He#Wz?fHwQ>E z;sMnLfkAd$*c6Z<)R1n2#*2Xkt${e81L133;?{cYSk)L0 zn;4Y&AW>40TV^`Jx=}X8kDuBUvof2e&i-^7)0V`z+nGBb7z|_lFqn}xSWkrKv_%g_ zJG)>fP~H`keb)tMo209qL9{BbGL40%Sr(J`+6}U5&0u_}v4P5UtU_zE8X`wEtW?NS z8pNk6ec)1Zc3ZoaMWX^<6P7bRI)MH&Mk<)H9tva|Jp8f7!#AH=A(NwLhNNxZ)Xu5W zCTmGs&#ywP`n2j!?YtbZ3xCKC?B-OETib^l{RllXd{eoqlQ^(&=6=9HbR9|GK&jmf z<+kALqfbHPqd5D&(I3`|{*Z*akC>R)92Ff8?IEcat~i_yb@zx2N<1f?tJo;yKy(IL z@EVStvM5oS>#a(TMpFo;k%l8;-Vnv1;z_7vgH>aKuEJYfr>Ixcv&TXPq!Bg-HI1Eu&z~j9r<&OJ>ZafpZ9BK`~`6t0*S7CC#CjK`bhzq#m>= z==MlTK(tBg#mIJ^@Bmwnz#@H-pO^hsKe^g!uC=NQW4pRGmF}AJ_Wdp&$-MF=5p#<< z+DDeKB-Rp_dd?r2ctuLMeGWAQuru_0Iso+}m-y)b(!=MHq>iK$3DP6b6^Ik;p&D>k z;(fb3TiU_Z5h420B6Qv3?a}7S!FY$uov+_OG5&6Fav`O-@J{!$`xdJ*;eD_(<( z6aC{sUpPV!}%))hUQA0|q!-VfI^Cn(HCh-hgEeOoZYeWlp-zv)1g<$~eDuNlD3 ztCTeOzMY&wr+DD=CDS&)G+F5q6H>CpsDBx0(%s%2-ANsj#e)7Pz!|SR9k0CB70+&T z=s%oO*!$K#3?OiXfvb4$kC&f~m+LRNfn=tz_mkmJ6JU#rxZY;Kh;};N_-Tw0H&EfH zbQEKIa;#Gq`S~H{Oh1P4Cl~vo(}JjtyRtAxf(&@%bUbWxd(2`VOobSC#w&l0SGF;~ z+2gl*?EQNxV1XQXv$(MNVA|C!+gD`?-^78%JWuSvgpy$Lq0Bpz=j`vQiH67;r*I5pO@Gb zg#whPDmW^agQb~CbSLa`x2^JhY1 zI5LOK&1nvRWr}EZ`u$g()6$uF1bMIFbf~KGoe`#TRs;ba-|VDT;{%T=<5I zN;qAy0qR6HY1O)D?>dl4%h~mQaY5_|oJH?wokienx920;M2XY@P(*Z<5e{j@VZi4B z5F#onL;B5Sj6_*hXiSwi2bNa9+@2Mb%6Rkp-c=qaD5a5Xaj2)|M=> z2OSpiSds$wpBq?^%zuDfKc8|}9BV7n7uKY9ej9OCrXUj)VF9M^Q-qN}%b$^oR3aQ# z4M!!nt+7TW)WD(&JROGx=2Xwg4x@55@|#|g)(96f6Q0JKrQ`WCjAql|b?8H@V~rFr9{V;lorSa32Gpcrp6tzNZV{ppUDHLx z95LWegoF@FXE{yS9E3`C-Mm}Ia8!>Wb)MEDXYL>(Q0Xmwfyvf)G~#COTuZ8X6f$VL zqlJWhh}Yv%N2?yYlkJ60uN)uzFIBFhOt0(VxTCe1qbz_Rn3)m``86!cnzl?)wciZFy7gD4i{3f0>W`=yA$7K{LKGClNconQBF_ zixnk!0F^P+xyNVqv5OQGoYU%Y{*RPCv+muBSv)*r`O;}~Xnf9F8rFCKZ~OJOlEb99 z!qxTR=o^BLhy`5k`hd!Z8eUB5iuQ2B?uV%(CUONzh-KStFFUPrAwoi?g>8?B zGp6MJM<^Um=MmY!s4)mZYZyU9N&FbO2B)Gs6&u*xQH~-}{ZjX_uY22Q^7sskNm{Tp z7H9xO7ZtO6j-{hwEvkK?z<*I5TYry&_r6 zq^l(`bT-+@L|Vo8F^rAZ(FkSyOl7mSMnxUx*LcjVwlkwRqEMMc6>$f>-6VpJKg?02 ztqPOy7p+1CvL#sXp@_7t2)Z(a6+%*21$(j#rs#%n%e3TreX`H}X=TaKMrP$h(LS!Lcqq|U}o^2u$;BSN>b`#W42&sIj+Ts3K)9-9q((q!@ zOQE&h0@W-NB)}p8ibfikjn^;8^9(uVO^{JbIU*pTt*ov;8-1gpw0jM&;xoHk5(rVp z=b>YZ0VVV5tjTh+vbHX)8ja6}Caa^_%xTmVb=;gpp1iW7@calE$Yg>oCDDP+^UFRb z-Z5)X#VvqN@^qZEY#yi=G=lrLbl$@EV6=xu-!r>8CXjT32A6|@@Uf3m-V50eiyO4?Qyr64PY@azhRW`r*#5+cZA zoi+>Qke8#y-qo+&yFmQLWNa4(IP%-sqDG1Q;EfI)xun^ z?}mstAshfx5>jKu*fdWn%$-(<0IZZ&$*6adF~JDK*B{R|;Em38o*ZoKkd&9aw`2wW zWkOtvz2qi>SA(;|)53P190c3^uK7ie^t)v8B||Qmj)#XYdQS&xeYSz`QUm{*W0vHyKCMQF3p%2CjBo4|qmMmbgO1B(eTQJ=;zw0kt zJvVXZn(jhIOwqNlT#;sZ`L6w*xWOeaGzIrMT`JqP&o$GuGT+6;GAo-M(?L83dhc0t{4#$R}#WD_{tDxPP#*HvF=8RewI~ zy&=c19d5QHnU*DZu#d2`af=}=E=IVJ26aMAJu>bO!_J$#i)Ca6-altuW&0>jKTS_LH*6LG^))QC_>nch#L!|y6pscA_%Z(DAMVNUvydN66v|8qn9J{ zfs%1UBAGpNbBNZFQSTj2NS98sP|~yyMu*cr_i!)m&;rKMxKxNW%L=3Ds2Rrq&UsMT zx|QkK5ovJgN)_Wif|92UYO9oAV5V=_Jg3BZP|Z1XRMxw(OdHBKc#V5ue!TZ+d-u`f zyY~!cc3Zg8$D6p0;eN_wMpN@aaDqy zz$TdYet*7I)jd7Z2s_!`bAH!uux6&Gr@Okko~wEJhD{*jw2fuuKMuZtQ%LEaEgnAc~K*zSR zxI11v8ZG+vV%bg!pPx;lTc7yIes$NX_j zenxE4`2+LqhcBKzkTQ65`jj_yxTQ@HDQe!K-U6f-dl)NBbfQx;(uu%>JyOMXaXA2! z{EhS@tv%_S8raF{kQ(q#-7dd7n77Zw!k+b5Orb(-GvBPw*PgA5u0xaG9+`0@|I%J| z&^}@8CvQ1ALNN>8Y>5d$s?Kx(Bn^uPM|~cFV0MPg&w3H` zZDh0joLy5M{<}S1#=>qNL2GB0Q|lgW5W_YHhyBsnsjr6$ zyA69<2U+UGj`pfauogB7A1>f>9-#4Zkz7%{oAxCS9v*MpVYTmM|z{>%L8%Fjzn ze_8l>>EqI0Zg;-tzOHX~Uh`{t`RCrPx!au`MC+^0^D`z|T{k+Rs~V_jZTrr@eNj;*Iu;>i9%3Qpnm&EmYSy zOHbY(^!scE?Y(FE)P}h}(o-Kp_2KAFvMx>h=qgmG6RI1;mC2%QWbODQzwnQ7ByvYL zZA7CJIgd=b+C!w@S68Q_v%Q1VlU>9&?6-GnKlfC8Ljyh@Q53X)5}%2ycqy*zYw_Da zSiP3J;oM|mvH9bZh|4^#xb^|qVPEvIJ3M1$+PRTgBDmr3(2uiS4l&|~y`kVy{{?RI zQ)H2U&W_@T7b?k@^kyYAfVx3>nko{{2$^Nb9Pg3<80Srs{X^|&dUyL<8=pwhT3ZKV zBv7EN+GzVCxWoFFm**~@pWV83^~M#WFSm^BJJfqeg9uCjD4@7lDtK_#J`rL{2pk&?#D`WgkGG<`~ z*{?p8CD!0oU{4m|r4>PtsqZS!6U+*LpBthj+Wq5!Sq}geo+(?71+6A8(ssLA(I-`u zHCP~~Aug9ciRc+x1J2v5`AMj!6aZ|hGX!B7wAlj0VBl5=bFH^M*nwCeQDOHJhRknz z?>9E3NUO$JZxgpmpMa3bJ75C0>iCNkHg&I(q9=RE=DByi5_Sxo5{|AGtjd5XCipXb ze=1OpELCO$xcrA)Dp+$@Sbf6OnCjRI>LT`~gl5%vKuPDtk&yGQe2Hrswt3 z%6jnYfzD;LBCB-jn~FsQnU{Ts^XuMvo_~oi)gW+RR47LOTsoGspLCHa%Z_|B7RS17 zQqq(#fjN^Wph|@n&#TaZgch-{0f#%j;{HAJu|vt4L>a@(&JC3d#kNWhSftF22lnIv zvey!Zw7#tfjIhbbCb;e|i6kca;pn#wHHb|JdxS??g1?U8931Tp&oJjg2N!PMET;oy zNjnpWCmbtaTnxwe)MeH`Bq${l(D$~8$RS$;VGYDp#@A!v@@Etrg&OZKraC$J`UUKa? zD1y#uE{qlKu_-;cvVFT;8HD+s!yZSWZ6PR(m8G^__*%W3sq+v?q$zoF=KI?VX8M*D;?KImefXI8Yx+54v}G!^<_yP>4kfY<%83g@vQM>EEG1-A4YhnI4Xhl0Ay?Q| zwDnBzR+GV!+oAmPARc4E4-w;nqF4uD{9r7jOP5npg!BZv9QXBYb!<eDq#c@`d2nX8DDsc7IU&n057%Tz3*^%+O! z`d;xfFZ{k6aMFXjQo!wj+cACh!;;M61P!Ym=Jsvs`FoE-v-BlL&Whle6*FXk)ESWw zf=hJ$^~Q_mZoQrFaR7L)|N7Mv+58}N7)oVv2)F^y^bSD)6k?1VKq)(dsn2F)-f9{TNOC+H}I230I4e4aqK{-%zyFY=&W^s9ierKOXcv`JtR2Q`mN~x zkTi)=uhmuu?M@3y(&}R=ZK=|x;r)#-7Or*}qA!SWETKNDZU+(X9QKic{W;XcsDFOu z6lBfLZ&fpYszaoA#E~By^!MIXT?5gpou*f+Z(dD*PAG3k0e)fK=W6w_xgu-m%Y8G3 z7+MiTb1xS6^I8=-i3!lY^87Xq|Y8zSB>#crypc|s4H^lQ^_4n6597_*g zvctMyy9*Uo>C28;G9hRcOGpWa*l@3PfS!Bwu9jObEFi1Zp1Xu!v|Bg{&&eX}wFC~` zMZs;icF#^*9LS7DSv=tgII$=Lj2i8NOMONL1HKpI{mOGnur1*X0r2XowZUAV?7oMGWz1=0XDSLe$j&cf1rkO1tRlP1!oHbk#gH zP90S*^ySsnY8Mc4dtdaQd*dC>zu7}2lxg4DI82-QS3Jy9gAp*?5fCm)*=*QYz~E0D zOsiLcJ1Z%A(E{mfY#&uENoInmLM1-&hIIpFUs2cs&BIU5ZK4Yh zs%-zW@y&_KM^W9RQ4mB>bIhF%l>1aU*)4{bUhm^Y79Cys1;g_^7S`m4+as^cDk-=S zo?K2#>BqX0*MwPBs3Pu}c!q>OIvok2>Yi)tjHcfU-Av}}=tD1(y1kM>K{R#}o0YyhQ&b%?G=HYO8N?n;S?fIZ^{PAjMhomA$~>;|Wq z$#?fS+eJs$n`;kRqc;!|-hrEah5Yqj2$(+BnQjEK7dqI2{&{=FS)cM!`AvE9Xc?*yZ5 zr4$x|@B)rE=EPHA1i2Su1y(H;ggSPRSi?O@2S+*Z2@ckIC->@;-I-Pd+#W$eK=te?+P$BCj#EFFT;5+4>s6LVX!C4OkE7o#>?WaQA~K?oL`;xcl7?AEJl7ZRSv<#FNvo0PnPghbFH8!=%`?oAsLKqgLp|iVj9I zma*ol4a$;vB-FIw$nr(?(&7BU5T#P+hotkKTDG`WWJNy#)e-TsmT~c&e$U8m; zS-U(ki^F2~c+l<)x$N4pm{hwuTlpgI>(kNxK7P2=<@OhyJwx-s-n%(covu)$)ZOv# zMC+5|EAJV+u3<>s%0#O8pt}e~7>^a7Q*T*ea&$F3MivNx{Xc;SzL5SgLIGn{L@=%< zY2)58U_^*gRttGj2%ac`gR+gIA1bAA$1 z*zR2DhsR7T8a;1!c8*v6i`@Lzz(L=ZvZbH2#E^Uy?Ve^_&qYB?XVK4o^Ni*5TS_;?Fh!S3({VfqyofKi&daU}iPV#w@}a>LjdxvX!egMX~- z94BcZIO6Hxb~(l1`Z3Hq$bKBCCkrEC(6w3Cw^;2_xjBJAiKW2as$?6+rzSLEPYzC=&z89lp1~kBUx_zZm;a?6W@JXwoU8ZJj8>tX&Rys zbtZn-3`aXnfYT0u_4wA%p2li&PDPQaoBN#W5=5d#vEmbLgug0WjsTTeW&rF}-SYvy z(a{N7+XvfEDIn4`Yu-*B<6@03?F&>$4@u+}+9IyQS&YjK!Sf6y*cIVp>yaz3!-T9hdLc4b7Y)Blgw_k&W;RNr& z`^F=__I}T=J@W^5yFcV6)`HCh~;_74|97i6}n+ct!D=ke47htZ>{ z`wp>nfj)iry)J5BYj@_3SJr#C-uF6R(nI|rexChy=ePR(quv0Q@92b(%wKqt1xuUH zcBfUpv3NSd9`N09A%W@``fAQ?B+y@x1GYAgx0la`ovjW2{d#oO`JS7`1qdly{=1Tv z`WL&S?nw`4Irbs2j(V;TT|z0OAZ=YKVpYz`ia#4StbXKNt!G zJnX?~rmtpbWaR^PJKF&Jl!C6Ut&J_hqRW;hPCo7r@obd0F@MD3rrrxn#&6KHQaDN^ zcQS^G?3ZX5jM5f-Wo4H*IO|~VV$WpWpiwCA(}K+RH7O-*2X#T_b*)KVka>T6rEQUw z5kt=T2M8~^{XO+2zEgIMhH+WtGk76OGb7b!8Uyz(ue7lydj58_aAk;-@8`9EuOgf@ z0S+j1Pb}!41x5!5xCHNbFQyXdRbCT_hPrdZe;); z_$tXt;iE5B({yFOo9DT3X?z_asGKXr*s?I}W=t?exwy=iumSziwkzjacj+VY6bWJ7uqU< ztdz7YK#z#m)d$_>Z$}|zIrb60iSb2?qotr zD8XQHgE&P&-n!ap*t-e+ENVhouSRq|LV8jXdsvD&!DF?E69m9^hI~9uuMuRLM8Frv z6{f^qY8I}Z77ZIPcJk{+14%9)*7dgpXh5(jzF`VhN+tr~3^UXgUbYt$cfDCvxIp%?!F)e5mp>7=9xq z%F!U}=r(qDr{if>$@jK^YY$N4%&QEAQtmVe1%1_=&1PpzBfxcKaf1MDl7A*`+P_(o ztl%#;kb>%q=wl6<0AQIc4W$+K=$#@HHA3qW*0vWqckd*_`vgW?o~?g4p7cDrl%7oz zWZ@m9#7<0jYvjg-Z>3~uiGPV6nfdcUSMjy-s=p-cFHJa@E^wt`U0RTMYuu05R4A+j z22nw^E}VJdiBY`m8Wa$U*z5sVBSf^82cdIS@_t$NUajuO=IG%-rI88P6{2@kpCO*t z_K|$Qr<8;oU|VI`hJ*RF2A_)6;o}cuEFh+k;=Fqt>`rBB#BV2y8kWK6+kNJyRMfFg zqlRUahqC=atT5r=FOQdB9jmAZzaJkjKRPC^c>>)j$xX(tBCUk=^{t>t;Hek5Xrm-?Q5H}+QbmAvs4e6G*=lnO}PWv%Dm?LK{XB}X&m+D`?-P=F zaLu&2AyM@P0ioEw8DeqmI~X5YLh8iZ!R<7bUB-n!n(g-WX!YCCGO}g5GBNXNr)g(Q zzy0lK_3IHzw!h64KT)+q5Bv9fSQNXVy{E_&LY*|`bavVT&VS6I+QIjH<01*i?0`5Y9F;qJ# zW9)8kA<>>$t|bWl!|p665*x~?ZZp$K4A$ePpo#%`(MQ&xL4Yn6q$&7SlOh5{OvnpU zNWEm8=*$)5PjpK=*Pv&#gI>Gf><*F6I~VtjQ{#Y(jXeJyTqxy2dbA=-G8;w+7 zTq__WE`Rb%PEL*+{ljc1gPY07x4>_Pk=86%n0!fj6h{B;=m^{O8HMIc#D9woXEmU|<fQDoddTLM+tG!fuDp|1mrbb?rZp}0=s(;6fhE^Uiqoal{Z-bBTO7|Bl`6f ziZS{HO7e9!yzXJcw12gRhA339Z zNJ$NfS0QUBeI=$-aI%mI``v^w(@mtOjnUI;5FudqV%Xmzogll$e-FB<__g;p0TrZi zn+GaRVbz#w6ejW~^EeE0!3?~PzozqlBev8JMj8vl<04CR`zJ%8;aYk#cauzk5EBGf$>N&wB z);*4|CJjQxElqU-oN$Xo`DdcPvdTJ2mi7-%;j$wjfQzW4I1_bhxm3a=1J`^q`1IeyyDrI8b9Ui9820^0|ZW4cw-bQ~D;SNL|#6 zF3j*&69ytJnGwyqo{eoRSthN{auI{jiKJLJj3#}X&7DM`!C`bzpJAvLt<(&m&Bs!2 zmZT>pbHA4CVZ)HuVun!T0-@M{Vx4xPr2|G8O$@bWH3>oH^su99RS`ne><6*p#Uhkfs%M{gK9NJw*r$H0)!x`5#H1M z3zfUnq~kv9M&)&C^$Qwv^Jd4edKbuCP0Diru=8ZEt}GL-jx}8+PWZ=+>PW?ekXywd z;*k0Tn)ElVf#1TyQ80UlsCkc2^9oJ!jJE4`kYl^^h+a0kyX{Von-&`L zn&Mk?+_j5`R)6d5;mTh-2Pl0)ow>^wigh{mOH(lI#vwO^U-5iDF3~^j@dx7FBT$9w zxywg;bh63KaEw^9xP8vM+*Vj<)%GVW_3EF9P=>0Bs!Y~S{I=MY-MBCdO}n$6+b!-{ zzzwzY;+BAxZ*GhlRLcy>ZOasq>r+`PJ+h}LcS&XYxcs8?fzi%gZj7$bg?}0`s~*~O zUWr97TDHlDDF=PN+a+vdqqm^qTPAI5AU8>B^3BB=f6Ktl)B<<@?mzWA$NR?rv1_rw?Jfk)+%<}?p+Z5 zKG?&^V6`QeIdt-`sT%(Sb27W3AeXZjOvITfQ}?p=!G_qIY5*x-CnO2ta`Fg*{-pu5 z=es(`A_90mrg}TP;T7~_P+_7N?f!zZp=?zQbmF5Qz3~DgKl)d!7e0{z5)tAqg1__kyh}U}KaG@^k z)N(I#l&4i~&1slbkV2Gcw1~R5WFpj1gj)1_XSg8(DG~}^D=bwCx)8Gvl%+iXG@9(I zu9@liOxW%lY_Ceqb$Vqd)U0e|5Api?rS-|HbOp`(k7a3MHH+x@SOHtSq`vvSWyzs9 zqYHpF8Ls2r=PE|*y3LffU(**-Khk&VBQ)J&Cfp9L!O71?zdwj$)bB#wYeq5$+)OY! ztS68t)bs1`Xl9dZ(Kf0W@-k z05q7)X%Lj1wUDKxs^jG|84r@MU%k<6C!t_jVs|rg*5)oBpCRcs7v9L@nJT^!qiemV zP8wB8TisS1;Z4>XLin`BrX8tq)lmwlW}tJ8BpRvoxg8BZt*o@aOvgWbF>WO>Zk$Ha zazfjhKR7)-9xva%9lQ0HG3SZwt7Li*24CNxa6tt_Jf+S5EyrvS19y99eau2I z`I7l?Ra&C?X{vVK{J2B`);~Tu^$D9qX=L+RyG)a9xIXoj4QyqDLUu6qwqmGtd&k7~ zEa-4re#pt(v{NrrCPc?D;j#-dD|@ z944TFsVdTSMnuAfOw+Man)!k@l#0L=1^O3NE{niSJKCYW5Y-@r8j{_Use`>*akdP# z3rs}Ri+*^xymm;1?bWA;%P%k&)#a)B0wkWB*!||=Limsj{** z$&Q4_L%f6%VZpQ)$SNG_fi9ZPNxIAmL2VbMyJW3I4-TN>#RM_in+za<^Xh6l)prVX zNFs2O9b*rMx}oJqEu-F+%96~(Ls*qhG7$Xf@s8|~`4Fs?tr)J=<29Tl?IIu3e)np7 zq2m>&RBj6U)ntyEZ*<@N9hrQv;t@Egg1gVaYK3{tU!vo)Kpi*E=ya0Ol4vCt9>By5 zFuoPy3`vEwQgH#ZwycWTRYe>bj9xe(zvtXpMaIVM(y(cAab?=$lF5@2U8d$6Rwzn z1-8yDezKt-ot1Xr!le4)u<}AoRj_kd)T?(F>Q@bo6tF8};RtwUCe;3#2}x%7=lSV0d^<%x@h)xNafHr8=m2#;omV zg0!Y)U}KsD9YXubthd;5WeN~Ysl_N{c1|(O1^N_avUWW9#;e~yw(L_o7}zK!sPNh0 z$`%u37zG^84i)XW)jPzXsB^Ycr4DjV9P2CAna^+j zp{KSLjhX82{O}VE=z;Miu5E>E8m#H+M0{|n)EVoJtYap+WDGwFWB3O7g)03f;hR)N zOov`B?(NPt>?r^c{%63sM1faN?P8A)h z)W5+v61rrTJV6gwcL%I2sJ#mea&z?$B%5HpY*h2XU=SA_h=N;nr6ONj)q+HCtPw zIc~1jq;8I5(X^n6!PVWFc`*T-O=$HT_(sqfnyB_hIH zAx3#P`PQXFp;}Xj5Jm;W(hxfXr8>V=Gj$ZN>g!B)As%nKK?dxlgaU6C{bgk>(W52T z!P6_8$aRix3~|ldv!+s1w`*uyTeS4@Q=Rpt)p~rGSIg%BZ_Fo&nV=b?`=mp^*mmK+ zFYfRW^p1pXn)@V#5}&IntmR5i=>HXA(GeNKVr@sQladiw8$WVtQVg$A861cW8~6^z z0VXk5XbQBlj$RII7PR38*X(BfNvlUMQ={ASj8fRFHe z$er)p?`IU6%4~7>S9&oQ<@eV6$$L_+siDf18g(fk3J%d+^w^ z7C3jq5j6;)#C8K|vXI980%l1ZF>iMWjh>7mzN<3T^=EWhHy;{O=7Ul*vu$}u395T z5(ObPt{x!yrVd@>GNpmLN_G+hnN}!Da^Qh92KHK=LtP09(^qIWJ{Y_`<=xd^&X&JF6gl{g zJxWB)hklPdyJI4|{kMB{xg3la?G8W3*e%{&s9C%7t6nQ_jBuzQL%wnIE=K8%?`gxa zk^6(Abmv7>JE&DsPKAJis^@jF69lgyYu^ug(l<@d0XNgSO%^7F*{EocwNAFITn8uW zCk>8{`X|<65o}H_qLRQ@-wWyv6V?*ToWx3bgDI=mJG>H6AKX1(3pDjPbhvx1YKT%32|t8p0P9@UA&aQK(fQ2 zN0?085@#ErXC^B&U&BFVM~X^S!&H_e0lRkaVLqKJtN;0&=s*?a60D*Lk zbK_hX(HCJW=7zv%22nRllS(*kj@Em8(n4otb4* z$Dj~uh8NGeM}uPt(MZop=aLYDt_|=Sm&Ar`kb`WB2+4fjJVqt)Hd;l~0$lCPKs|=Q zB-2-9eYD>!OjDYYm0K|501e{Q+DptYJ~S8G3m9cfzznaScPINzBZLK;&w(KbW)kUa zC~JzaG4t{*D62|bHYrdk!p-e}7+cIdn+3!`{RIjjV}lj#{|aHvl<9Wo8y5rPYJF@X z;5QNhzvW30nDzsgDKPD8WI?G+bC>I5TK*K5Ih-NxKOln4_gCClr<{-WztyU#(*0pB`d(*LBYT0`7C-cOQJaO~HCLwy>ChYN@F0Evc?+(q7L`lMYgBrQr;fTDfz3P@(8#-tE4WVof z`0Xz`z5SKTWZICBYr+4Zq2Z`o$#Teze94&V%UC~26Y{K1TwO$IQzO7{8~PerA+)|a@Y&PMW1OvRy|Ch+vNmCXZ^57 z^NJ(L4e^s5sMcr#C0t|>%n6CbU@{!-y-OJ}F`lsERbs9eQ3;_ntzT-4d^g$B*-KLf zSgq{|`L&d757sr+uN~jKNnvTvD5~6#qW^n|{`=di34=C@`s=j8UbEs9HAqi>qi(om zbC|e`+*sr;1u_^`CZk7%qElOMYQx^09gx-EZ=#S%c&qPF{MbH~*hqd+BBG?ZX*P2i z7QqrHIwyW+o0%b#I{(9A84p@7xfM#YXag4U@KgB+A_Gg?ORkoRVzV=_F8bGlD4g!Q zO)`yr0~&jTlP_IYFGKDVtS7c~>eAmywCN}&WS>jHGU?%9-xOHQ_C{T0Q(|ng(If^J zZ}A9h3h(YTWD;#aoX_zRp($Pikvixm$V^Pwfvi*(7PO$o(R&OpME|^xk2uzBavL}7 z%-F*XThkdt^G=@JHdAeFC#O~oJHQt!!OXd~ZLtY5ml=1ktBQA<9=2u-92Y#tv81n6 zvVb+=J~+^v7Wkmz;+N|>r)Q^7W~VQ#d~YFx9jLavz~{;7fGCkxEf6Hx9Dc-5C|nH$m_YWX8E@_pJ^@9|vPmACDb%^+ z+-F*m)UHlk=`ILZovsy>cKXFYgWvJ4v$tw+oXb(8o8&tCS_j{VtMq9j?5b=IDJ_LX z)9!PqV`}ZV_q&!UFLi~tg<*#^QrYW!Ad_qpq=sf2kSFtm&C`k%6MNT zHcM#N36NM^FitDGS_Dx2&g#}X%Kh3`KBL>PlGJu*Beg0IcvPhorgrlj+C~TBLkfO_bg_mgEsL=4=Z6qvJ>puyx>+=IrA0F0qKmT;f|S z?)>J4rQ>}}E)P|2T2W12JLeFyj91S7ZA|XrLj`{9(?K#eeU%0Ff8^QXWN^YA*PmWc;~HzDE`ExWou$*SlPc*T>}#gr?}Sux(khr-g0HZmjcO zGG5t@_uMe!mGu-8`@qd9>y$O$Y_bmJv8#yAMrr%08-_Yg!-#pg>O3f$HJFH|O+xAI z!bWuRuVkua^FdOblejTu-;u2PhfP5ZB6cEDjh38^nwh52H~XO0q;APM*#CD}av=Q9 z^|IAsrmS+&sFO^Qh9th!x~;4e3HEMPNt{0fUPl{0g7QUoKGOp4EAxYzuGrOKJ^vQH zvM!c_JyRPT%!)A+0?)KRW`#+KM$FQfz6g=cN!Pz6N+PeO0s`) zMM@y3t>880yxsk2yHyhRL=D*G0%6KK}ScPqUju83P z8Pq#rV*1XMCR5o2(dNv-55T1g05b;)=#b-@-c8_Pn#$^gj^LZY3q z7?W1CqKa2V7L&AVV9m5+0{d&4?@V&?1N*DA7x=o_vFbCdZPC1y%yYJLEEMy6A4^<{ ztpqxi@nbU5vQ9}n>*x8X*Y6l>OpZh)yKq*uLO7*sSH6Nrl>^{1L`;q5lSaG--q2`% z`Osi~+25ZwG9;$iXnwg4r8O$Boyw>IVwOzKiDiXWBWt;miE0T=!MHW97w>dc(p{gEn zpbw`^H;i;`ix(op;hJ#<(J>w3g!piD2>l}+Vr_rr_CIYzTR*>F-2Thl?Lp^RZ{@Q6 zm-g}&r6lkqnTeVj9qj=@hV5ZjdO+K4*K7M6KTkV16LQ;5ho;8&;M7dpld3 zW^;j=*cB<}M|^U-b7p_kl(S~`%>}waBH)(AW$tr6lg<-r?@_;me*#u2W+DxoJ43o5 zV_oBBg(-H;51+;djyis~Y;TZf_Ckv`zk1`BE{fmY$>8{Od0~Ead8@nl+nvS#duwTN z`_}Tut$*HJzP=7FKWEc(L!blc1UE<-6|itiJ$DB9pDG9z~!8Sx0uxJ6r5k ze}DbMF?(plq2|~rIH<#Wp-%*YloHW;w(p1Qn!Q8v8ej1mogsWtlvMU2`9H#t!Gzcr zXGg>|a%ggDMjQrP$A}F2zW7}B_4%oz@BEd4M$1GY{gr8w8u&RV{GaC$f- zx19KuS|taJ2IhG}ayhw3SfLYz8CuAG z1$qSuUGi?o$P4$7Ni1#bO7@c8#NcSyO_lF)J5ou#8aqWS86s6kz*>F}2llfX@qvxF zH&}SOKTk#S!vV(7{Nc(p>T&#eHXcX&Nj&NIqob&A z8{IFr|3Reu{eRrnU-C_!)V`9^_w%>%jq;1BoJ>L^O48U6vbLVTUKPsCw-`{AtSMe+ zo7?1JQul1r*C@J+~{Pgr7GOK+KXeY{tXE&Np5OX=AYLz z^+sj>Nv%m;nSZyh0MiG)#+CCS(4CW)&UEU$X+|Mz2R(^r%S^bq7P`;ms-|;=sAbBu znm`66j*=mhL%Ga*m6v^c%M0^L9<(|%t@G^R2%%HneL1_`Hm__-<8HCuvp@^iw6ci` ztIXUX6i?nKgi(AolxE5*th-75$x))o^Hjr7CtBX>z1n6J0c1Bw6d=} z(+HOcbp?nGzyMn-V8EuhPC+OY6u4PJK_2%CC4JZZ^< zvELsZwUGul2$b~P&PQ|q^3-*bWmlIQNEA_MfC)vuL?I? zQu?aP`weXtsprR{hwRnVz%ej2FcIwwh#mT(#Jq?wh~q?Cj(Ny}=cSyO1-5E2DzU6u zlL?Uu39ed{DS0anJ5Zx?u~Hv}9OtW-4>0v|OT5>xn#7G!-Ec~BjK#aA_+ho64Fjkx z@66JOdC4o#q+5;RX-0z#nhGQtEt2S(7A%c!QfdVpc_qW6OxpKnM?j0#!ru{8es`^@ zAauW@)Rb{?@fdMGC-H-^pSwvicM7>ZrT9MdC|AcHj2|n=f_!hwfcN(-7_Pqw4cX@~ zSJipq+JIIv}1))yXf~%qip%sBh=O=orKp79%%W=TT^O8zO zeT`4%r?dFH_~W?%g(TK6S4+REDfSiZr-&E4$^=TcAtvR+zwI zCJ{>Yc^#+WgsVg8PFxW~zS`z25x z_gkDR-BMSr(NXK%&j@ZsS7SdyDTOl*?C`1BH}e?)6#?CeIK~TP;nKpw9luLxd(p>P_ZNE)>bGMjhfUkHl$;LAgQt zkW1wEe9qIhUntAus^|Xqy7V>ZR z#}?2I5c%u{goI;2nOs2!evPASeYw9~rApNwJ=mN1Xsug3s#a4{fZ>T~k8Jj7xxc5t z=bGj1hs2>Z$Z;+qo+R2dK{H})6UAx{11KrOAKQ}OX-hUET8ihNg=nd+ZcNuVbi!)C zT1sv3UDp{vnCy~=-O$HnAQgBm>0`~f$5;{s`5DFyryj*S4*yC{OCYA_;6RT?C)uo$ zX%aoAqN-(Q*gr%B@L71j8eiQ^F54Cgyc-JT>d^5RVUslEsF}=SLu~AIv?pqh6iV_2 zd4bb?MXgIVCu#0#Q5y6cCrTjOZwHP{lkGH^4a9pTl82#(;ZGdaAzvYUtAU0znD{n` zjm96SvYT|8k zFTL8Ee|$8LB{(YrKoVQ!LdSS1vVlrHR%X!XYNpxBIIMTER4A#$h9)pijKU@!5UrtP z%=~g|Zht$zYTLrMh{MZuhB}NsYiK54LWz9&5{04vLI#~Bxt2jFFODAavQ8rDZCbey zLyExrDFmkf2H!uNr98|e(1*6EYoH_Ru>#(!Xc|P<@-w+&V>123+}O}TkN8!vB$h~m z(s&-UR=0txwLU-jE}J(|ix9JAwhT%!S<@&RfZUXcc3!9N7zx?WU+-hhX73gSrMK_J zL{)ycl;El^0G1CRK*gr^9rfb>??rBBVryk`F6_U#euNCclanrBUslM)FFNWC-VRX1 zms5Gzx17FF)Us``3OS&`5;=^fpJNdI{e^MUD^VfxMJhP*`>XM~0k3*5Ht@3S#Z$X3 z*oJI=Z>n)Kh>fCba8V`qPUjeJoX!^Q6L8ai#x_9?#(j(bKNvlrFW4jT0n>!Tx&LCu zdT|=keV`Oe`5wx7E*9L%-Z&WNC+hNY+?Md0uND>-+jlwpB~~sBT!m*UA552z0fSj9 z7$MoYLl2nPX_LITQaOKwSJbd28F#du6Tqsly=jWcW@W?c1Q+G$-s=z1sBKIH4*f>J zo#+W&*%;Tl&hwaFgZBIFew^;v{P-(IN>s&Xbo9gZ9eqQ_ghx}=p_IhMM2s^eh{*6T z7St$z z1}Cpb8l4R-OgJozvmItrtBtFgtxG$h2of0SL!C4=mAXaj`QUC5Jr=2~wVA{9{JfLv ztyot(l@+qSm*PtkMu)ItQRxr?FKl+rEzN>4?Cuh0hSg`HY2jsyg78UyNS)P*OVJtp zFKxZ%wlgG{hWDm)tC$^BCa|h9lx1NdiBDM#O!mlpLno^`^Ns~Ap9DHGy=0QCX^x>A z1~gnuPR8n>Zsz5%07u3dxDyoGb*)coo|OjtiDATC6Pnd_k`F_Vf-0x^xV@e_wf*i% zzGs^umqj=DQjNcb=Y-qENhPNi>3vB;dS+vXeGUM8 zU{VO*lyF@=b0k=Mi<$eGn)y=)?{we=?|rg3Xiz8IA_^KwrbH<2jk~KgtJ$(nuaQO-C4$uQco2hwZ+}KKv$c+mAxOE#K6r*|C%F zrrW$7KkM%Un+Am=kwMO>9v!|KUf+hRD})B9=!)N2KWA`> zW7@uCrs1W^eta$Bgc=VYx^aDW(an)l5aG>ZEh-{rZJn6&`Ho#F{1pxe?S^$8@FU)Y{r;%Le$WP;|JMs_ymVyD&^B6yl{DZ&MA^}nZ zo6Dr1-;vJZB`CYX#vC`!b(8H{&UapRu5?OZ5Y8MTNdzP~6}2vj25wZ!Ohw`YM--E#t?hT54X z=XH+<#D$!%yfFa)J#+4IPKUMP{ZGlpc6~+@Ppal}?sBMJdi0{gFe;6=s91kOm^io9 zMG2JO^P)T*gG%F5>hT(}S6hnt-zJ1agW+UU3d0U@{Vyt+06W8}a;>?&sQds@z@t@s z=unqc^SHauDADD6SDn_}puU+<)MaruGi9-Ib629q#msu2-?{pBqxZF#VM%P z_cJR$yWGBW{Gp})7XSM9Kes#MLmnM$SV<2>LwT}DglscCIQNkJkEOevrN4LXk~y(k zb)Ca(^bMj)%CEqFEDycbe--T#pUDNR;YsOR5tnn-*-0g>3#xHEuGPy8L9-!B#6R#9 zz>m$|`>dN>W}{tV+|Cv8u)*m*1dB~JC<>#m7*Uu$=_-kbxoYZ|jen`qL zLQ3lERvXsTX_jFYsY~ohm62TQ_~5d&UtprI3EoKYOV#$0nC{zqRm37)P)5af_TTRO z`HckZ>WxyyPCE^Zja}-pdftLob}F?>CbSL*w;fV-5-ZaE=>oY@hT!u^sWTTg5QNo} zX|<#ad|p}9DW-mNmE4lJyLp$mjzoQ*vI z+JyPdyDMnI$B&VnXePB-2e#g#w~P&6-Ir5PCeWxDw?KvAd_mnkb}<&J-TpzB-A)FH z0|u!n84!x*$15iUX@`lwhU8ge(Lj^0syc+BAg?~k1jMw;CGD=Ys8A@K?q;z-Ph@f% zJN?XCO{n27r_Ga+nJsu-8z^t9{DiwnA6MCEf8W>0sJE<7^Kbq%r_8EYx&if2%xPkE zru~g+YPmE)ES1(39r)g1&4Mf+pN#hUV@2W5Q!<(=Oe}3!5o-&dw`BUU?&iIPyr9QQ zLOU7U4_eePstJO9Z|3kP8q#Z~WS+4m$jRZ%yawZHL5?sTd#AIwjoD?^EI7f!p3}VR z32UARHwm$8W;OwD;r$qem$Wzyle*f#wsV6JAGeHEU%R1ZH-`N2M&uz>X5vjFj#F$T zrs%`_eQe%#HWVY}5sQA5!nXHW@r~>-FlghY6X`%}u#}AY(PxjFJycZ*#9YVHu-c)rG!qL!+)}!`asG3{Z zd*=%am&Hn4ocjRX9)8Z#!X>Q83r3shZCHFThP97YJ^k<5Zj#aF zf2PO+XwLuZY5r&DUJxw7s$MzZEi1J%6la+VOCSpw){Bv7hX6pO#;&7aakx*r^PV5* zqxSph$TZRSQpi4_vB{!2cllH+wCR`R*~Ew&B)|K!6 zpip;tR{o}z

&Dq`^L8nsb*g&rMx_t~zaxHM+UW2cxU0-h?`I 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 diff --git a/netbox/project-static/netbox-graphiql/package.json b/netbox/project-static/netbox-graphiql/package.json index 27257e34c..a97eb067e 100644 --- a/netbox/project-static/netbox-graphiql/package.json +++ b/netbox/project-static/netbox-graphiql/package.json @@ -6,8 +6,8 @@ "license": "Apache-2.0", "private": true, "dependencies": { - "@graphiql/plugin-explorer": "3.2.2", - "graphiql": "3.7.1", + "@graphiql/plugin-explorer": "3.2.3", + "graphiql": "3.7.2", "graphql": "16.9.0", "js-cookie": "3.0.5", "react": "18.3.1", diff --git a/netbox/project-static/package.json b/netbox/project-static/package.json index 0750f397b..34974fe12 100644 --- a/netbox/project-static/package.json +++ b/netbox/project-static/package.json @@ -1,6 +1,6 @@ { "name": "netbox", - "version": "4.0.0", + "version": "4.1.0", "main": "dist/netbox.js", "license": "Apache-2.0", "private": true, @@ -27,11 +27,11 @@ "bootstrap": "5.3.3", "clipboard": "2.0.11", "flatpickr": "4.6.13", - "gridstack": "10.3.1", + "gridstack": "11.1.2", "htmx.org": "1.9.12", "query-string": "9.1.1", - "sass": "1.80.5", - "tom-select": "2.3.1", + "sass": "1.82.0", + "tom-select": "2.4.1", "typeface-inter": "3.18.1", "typeface-roboto-mono": "1.1.13" }, diff --git a/netbox/project-static/src/select/classes/dynamicTomSelect.ts b/netbox/project-static/src/select/classes/dynamicTomSelect.ts index 72c9fe518..8e44ce6a7 100644 --- a/netbox/project-static/src/select/classes/dynamicTomSelect.ts +++ b/netbox/project-static/src/select/classes/dynamicTomSelect.ts @@ -1,18 +1,17 @@ -import { RecursivePartial, TomInput, TomOption, TomSettings } from 'tom-select/dist/types/types'; -import { addClasses } from 'tom-select/src/vanilla' +import { RecursivePartial, TomOption, TomSettings } from 'tom-select/dist/types/types'; +import { TomInput } from 'tom-select/dist/cjs/types/core'; +import { addClasses } from 'tom-select/src/vanilla.ts'; import queryString from 'query-string'; import TomSelect from 'tom-select'; import type { Stringifiable } from 'query-string'; import { DynamicParamsMap } from './dynamicParamsMap'; // Transitional -import { QueryFilter, PathFilter } from '../types' +import { QueryFilter, PathFilter } from '../types'; import { getElement, replaceAll } from '../../util'; - // Extends TomSelect to provide enhanced fetching of options via the REST API export class DynamicTomSelect extends TomSelect { - public readonly nullOption: Nullable = null; // Transitional code from APISelect @@ -25,7 +24,7 @@ export class DynamicTomSelect extends TomSelect { * Overrides */ - constructor( input_arg: string|TomInput, user_settings: RecursivePartial ) { + constructor(input_arg: string | TomInput, user_settings: RecursivePartial) { super(input_arg, user_settings); // Glean the REST API endpoint URL from the