7

Compare commits

...

4 Commits

Author SHA1 Message Date
7058fa6eef Bump path-parse from 1.0.6 to 1.0.7
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-11 03:58:52 +00:00
16e24b6791 Bump version: 0.15.0 → 0.15.1 2021-07-13 17:01:35 +02:00
477bfb9665 Newer versions of Wagtail provide extra args for listing buttons 2021-07-13 16:40:41 +02:00
6108469047 Remove old versions from test matrix 2021-07-13 16:40:23 +02:00
8 changed files with 106 additions and 212 deletions

View File

@ -23,118 +23,46 @@ jobs:
max-parallel: 4 max-parallel: 4
matrix: matrix:
tox_env: tox_env:
- py36-dj22-wt25
- py36-dj22-wt26
- py36-dj22-wt27
- py36-dj22-wt28
- py36-dj22-wt29
- py36-dj22-wt210
- py36-dj22-wt211 - py36-dj22-wt211
- py36-dj22-wt212 - py36-dj22-wt212
- py36-dj22-wt213 - py36-dj22-wt213
- py37-dj22-wt25
- py37-dj22-wt26
- py37-dj22-wt27
- py37-dj22-wt28
- py37-dj22-wt29
- py37-dj22-wt210
- py37-dj22-wt211 - py37-dj22-wt211
- py37-dj22-wt212 - py37-dj22-wt212
- py37-dj22-wt213 - py37-dj22-wt213
- py38-dj22-wt25
- py38-dj22-wt26
- py38-dj22-wt27
- py38-dj22-wt28
- py38-dj22-wt29
- py38-dj22-wt210
- py38-dj22-wt211 - py38-dj22-wt211
- py38-dj22-wt212 - py38-dj22-wt212
- py38-dj22-wt213 - py38-dj22-wt213
- py37-dj30-wt28
- py37-dj30-wt29
- py37-dj30-wt210
- py37-dj30-wt211 - py37-dj30-wt211
- py37-dj30-wt212 - py37-dj30-wt212
- py37-dj30-wt213 - py37-dj30-wt213
- py38-dj30-wt28
- py38-dj30-wt29
- py38-dj30-wt210
- py38-dj30-wt211 - py38-dj30-wt211
- py38-dj30-wt212 - py38-dj30-wt212
- py38-dj30-wt213 - py38-dj30-wt213
include: include:
- python-version: 3.6
tox_env: py36-dj22-wt25
- python-version: 3.6
tox_env: py36-dj22-wt26
- python-version: 3.6
tox_env: py36-dj22-wt27
- python-version: 3.6
tox_env: py36-dj22-wt28
- python-version: 3.6
tox_env: py36-dj22-wt29
- python-version: 3.6
tox_env: py36-dj22-wt210
- python-version: 3.6 - python-version: 3.6
tox_env: py36-dj22-wt211 tox_env: py36-dj22-wt211
- python-version: 3.6 - python-version: 3.6
tox_env: py36-dj22-wt212 tox_env: py36-dj22-wt212
- python-version: 3.6 - python-version: 3.6
tox_env: py36-dj22-wt213 tox_env: py36-dj22-wt213
- python-version: 3.7
tox_env: py37-dj22-wt25
- python-version: 3.7
tox_env: py37-dj22-wt26
- python-version: 3.7
tox_env: py37-dj22-wt27
- python-version: 3.7
tox_env: py37-dj22-wt28
- python-version: 3.7
tox_env: py37-dj22-wt29
- python-version: 3.7
tox_env: py37-dj22-wt210
- python-version: 3.7 - python-version: 3.7
tox_env: py37-dj22-wt211 tox_env: py37-dj22-wt211
- python-version: 3.7 - python-version: 3.7
tox_env: py37-dj22-wt212 tox_env: py37-dj22-wt212
- python-version: 3.7 - python-version: 3.7
tox_env: py37-dj22-wt213 tox_env: py37-dj22-wt213
- python-version: 3.8
tox_env: py38-dj22-wt25
- python-version: 3.8
tox_env: py38-dj22-wt26
- python-version: 3.8
tox_env: py38-dj22-wt27
- python-version: 3.8
tox_env: py38-dj22-wt28
- python-version: 3.8
tox_env: py38-dj22-wt29
- python-version: 3.8
tox_env: py38-dj22-wt210
- python-version: 3.8 - python-version: 3.8
tox_env: py38-dj22-wt211 tox_env: py38-dj22-wt211
- python-version: 3.8 - python-version: 3.8
tox_env: py38-dj22-wt212 tox_env: py38-dj22-wt212
- python-version: 3.8 - python-version: 3.8
tox_env: py38-dj22-wt213 tox_env: py38-dj22-wt213
- python-version: 3.7
tox_env: py37-dj30-wt28
- python-version: 3.7
tox_env: py37-dj30-wt29
- python-version: 3.7
tox_env: py37-dj30-wt210
- python-version: 3.7 - python-version: 3.7
tox_env: py37-dj30-wt211 tox_env: py37-dj30-wt211
- python-version: 3.7 - python-version: 3.7
tox_env: py37-dj30-wt212 tox_env: py37-dj30-wt212
- python-version: 3.7 - python-version: 3.7
tox_env: py37-dj30-wt213 tox_env: py37-dj30-wt213
- python-version: 3.8
tox_env: py38-dj30-wt28
- python-version: 3.8
tox_env: py38-dj30-wt29
- python-version: 3.8
tox_env: py38-dj30-wt210
- python-version: 3.8 - python-version: 3.8
tox_env: py38-dj30-wt211 tox_env: py38-dj30-wt211
- python-version: 3.8 - python-version: 3.8

View File

@ -1,50 +0,0 @@
---
sudo: false
language: python
matrix:
include:
- python: 3.6
env: TOXENV=lint
- python: 3.6
env: TOXENV=py36-django20-wagtail20
- python: 3.6
env: TOXENV=py36-django20-wagtail20-geoip2
- python: 3.6
env: TOXENV=py36-django20-wagtail21
- python: 3.6
env: TOXENV=py36-django20-wagtail21-geoip2
- python: 3.6
env: TOXENV=py36-django20-wagtail22
- python: 3.6
env: TOXENV=py36-django20-wagtail22-geoip2
- python: 3.6
env: TOXENV=py36-django21-wagtail23
- python: 3.6
env: TOXENV=py36-django21-wagtail23-geoip2
- python: 3.6
env: TOXENV=py36-django21-wagtail24
- python: 3.6
env: TOXENV=py36-django21-wagtail24-geoip2
- python: 3.6
env: TOXENV=py36-django22-wagtail25
- python: 3.6
env: TOXENV=py36-django22-wagtail25-geoip2
- python: 3.6
env: TOXENV=py36-django22-wagtail26
- python: 3.6
env: TOXENV=py36-django22-wagtail26-geoip2
- python: 3.6
env: TOXENV=py36-django111-wagtail22
- python: 3.6
env: TOXENV=py36-django22-wagtail211-geoip2
install:
- pip install tox codecov
script:
- tox
after_success:
- tox -e coverage-report
- codecov

View File

@ -62,10 +62,10 @@ author = 'Lab Digital BV'
# built documents. # built documents.
# #
# The short X.Y version. # The short X.Y version.
version = '0.15.0' version = '0.15.1'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = '0.15.0' release = '0.15.1'
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.

View File

@ -1,5 +1,5 @@
[bumpversion] [bumpversion]
current_version = 0.15.0 current_version = 0.15.1
commit = true commit = true
tag = true tag = true
tag_name = {new_version} tag_name = {new_version}

View File

@ -35,7 +35,7 @@ with open('README.rst') as fh:
setup( setup(
name='wagtail-personalisation', name='wagtail-personalisation',
version='0.15.0', version='0.15.1',
description='A Wagtail add-on for showing personalized content', description='A Wagtail add-on for showing personalized content',
author='Lab Digital BV and others', author='Lab Digital BV and others',
author_email='opensource@labdigital.nl', author_email='opensource@labdigital.nl',

View File

@ -28,18 +28,18 @@ from wagtail_personalisation.models import PersonalisablePageMetadata
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@hooks.register("register_admin_urls")
@hooks.register('register_admin_urls')
def register_admin_urls(): def register_admin_urls():
"""Adds the administration urls for the personalisation apps.""" """Adds the administration urls for the personalisation apps."""
return [ return [
url(r'^personalisation/', include( url(
admin_urls, namespace='wagtail_personalisation')), r"^personalisation/",
include(admin_urls, namespace="wagtail_personalisation"),
)
] ]
@hooks.register('before_serve_page') @hooks.register("before_serve_page")
def set_visit_count(page, request, serve_args, serve_kwargs): def set_visit_count(page, request, serve_args, serve_kwargs):
"""Tests the provided rules to see if the request still belongs """Tests the provided rules to see if the request still belongs
to a segment. to a segment.
@ -54,7 +54,7 @@ def set_visit_count(page, request, serve_args, serve_kwargs):
adapter.add_page_visit(page) adapter.add_page_visit(page)
@hooks.register('before_serve_page') @hooks.register("before_serve_page")
def segment_user(page, request, serve_args, serve_kwargs): def segment_user(page, request, serve_args, serve_kwargs):
"""Apply a segment to a visitor before serving the page. """Apply a segment to a visitor before serving the page.
@ -67,7 +67,7 @@ def segment_user(page, request, serve_args, serve_kwargs):
adapter = get_segment_adapter(request) adapter = get_segment_adapter(request)
adapter.refresh() adapter.refresh()
forced_segment = request.GET.get('segment', None) forced_segment = request.GET.get("segment", None)
if request.user.is_superuser and forced_segment is not None: if request.user.is_superuser and forced_segment is not None:
segment = models.Segment.objects.filter(pk=forced_segment).first() segment = models.Segment.objects.filter(pk=forced_segment).first()
if segment: if segment:
@ -85,14 +85,14 @@ class UserbarSegmentedLinkItem:
Show as segment: {self.segment.name}</a></div>""" Show as segment: {self.segment.name}</a></div>"""
@hooks.register('construct_wagtail_userbar') @hooks.register("construct_wagtail_userbar")
def add_segment_link_items(request, items): def add_segment_link_items(request, items):
for item in models.Segment.objects.enabled(): for item in models.Segment.objects.enabled():
items.append(UserbarSegmentedLinkItem(item)) items.append(UserbarSegmentedLinkItem(item))
return items return items
@hooks.register('before_serve_page') @hooks.register("before_serve_page")
def serve_variant(page, request, serve_args, serve_kwargs): def serve_variant(page, request, serve_args, serve_kwargs):
"""Apply a segment to a visitor before serving the page. """Apply a segment to a visitor before serving the page.
@ -126,13 +126,13 @@ def serve_variant(page, request, serve_args, serve_kwargs):
return variant.serve(request, *serve_args, **serve_kwargs) return variant.serve(request, *serve_args, **serve_kwargs)
@hooks.register('construct_explorer_page_queryset') @hooks.register("construct_explorer_page_queryset")
def dont_show_variant(parent_page, pages, request): def dont_show_variant(parent_page, pages, request):
return utils.exclude_variants(pages) return utils.exclude_variants(pages)
@hooks.register('register_page_listing_buttons') @hooks.register("register_page_listing_buttons")
def page_listing_variant_buttons(page, page_perms, is_parent=False): def page_listing_variant_buttons(page, page_perms, is_parent=False, *args):
"""Adds page listing buttons to personalisable pages. Shows variants for """Adds page listing buttons to personalisable pages. Shows variants for
the page (if any) and a 'Create a new variant' button. the page (if any) and a 'Create a new variant' button.
@ -143,17 +143,18 @@ def page_listing_variant_buttons(page, page_perms, is_parent=False):
metadata = page.personalisation_metadata metadata = page.personalisation_metadata
if metadata.is_canonical: if metadata.is_canonical:
yield ButtonWithDropdownFromHook( yield ButtonWithDropdownFromHook(
_('Variants'), _("Variants"),
hook_name='register_page_listing_variant_buttons', hook_name="register_page_listing_variant_buttons",
page=page, page=page,
page_perms=page_perms, page_perms=page_perms,
is_parent=is_parent, is_parent=is_parent,
attrs={'target': '_blank', 'title': _('Create or edit a variant')}, attrs={"target": "_blank", "title": _("Create or edit a variant")},
priority=100) priority=100,
)
@hooks.register('register_page_listing_variant_buttons') @hooks.register("register_page_listing_variant_buttons")
def page_listing_more_buttons(page, page_perms, is_parent=False): def page_listing_more_buttons(page, page_perms, is_parent=False, *args):
"""Adds a 'more' button to personalisable pages allowing users to quickly """Adds a 'more' button to personalisable pages allowing users to quickly
create a new variant for the selected segment. create a new variant for the selected segment.
@ -164,24 +165,30 @@ def page_listing_more_buttons(page, page_perms, is_parent=False):
metadata = page.personalisation_metadata metadata = page.personalisation_metadata
for vm in metadata.variants_metadata: for vm in metadata.variants_metadata:
yield Button('%s variant' % (vm.segment.name), yield Button(
reverse('wagtailadmin_pages:edit', args=[vm.variant_id]), "%s variant" % (vm.segment.name),
attrs={"title": _('Edit this variant')}, reverse("wagtailadmin_pages:edit", args=[vm.variant_id]),
classes=("icon", "icon-fa-pencil"), attrs={"title": _("Edit this variant")},
priority=0) classes=("icon", "icon-fa-pencil"),
priority=0,
)
for segment in metadata.get_unused_segments(): for segment in metadata.get_unused_segments():
yield Button('%s variant' % (segment.name), yield Button(
reverse('segment:copy_page', args=[page.pk, segment.pk]), "%s variant" % (segment.name),
attrs={"title": _('Create this variant')}, reverse("segment:copy_page", args=[page.pk, segment.pk]),
classes=("icon", "icon-fa-plus"), attrs={"title": _("Create this variant")},
priority=100) classes=("icon", "icon-fa-plus"),
priority=100,
)
yield Button(_('Create a new segment'), yield Button(
reverse('wagtail_personalisation_segment_modeladmin_create'), _("Create a new segment"),
attrs={"title": _('Create a new segment')}, reverse("wagtail_personalisation_segment_modeladmin_create"),
classes=("icon", "icon-fa-snowflake-o"), attrs={"title": _("Create a new segment")},
priority=200) classes=("icon", "icon-fa-snowflake-o"),
priority=200,
)
class CorrectedPagesSummaryItem(PagesSummaryItem): class CorrectedPagesSummaryItem(PagesSummaryItem):
@ -191,21 +198,22 @@ class CorrectedPagesSummaryItem(PagesSummaryItem):
# The `PagesSummaryItem` will return a page count of 0 otherwise. # The `PagesSummaryItem` will return a page count of 0 otherwise.
# https://github.com/wagtail/wagtail/blob/5c9ff23e229acabad406c42c4e13cbaea32e6c15/wagtail/admin/site_summary.py#L38 # https://github.com/wagtail/wagtail/blob/5c9ff23e229acabad406c42c4e13cbaea32e6c15/wagtail/admin/site_summary.py#L38
context = super().get_context() context = super().get_context()
root_page = context.get('root_page', None) root_page = context.get("root_page", None)
if root_page: if root_page:
pages = utils.exclude_variants( pages = utils.exclude_variants(
Page.objects.descendant_of(root_page, inclusive=True)) Page.objects.descendant_of(root_page, inclusive=True)
)
page_count = pages.count() page_count = pages.count()
if root_page.is_root(): if root_page.is_root():
page_count -= 1 page_count -= 1
context['total_pages'] = page_count context["total_pages"] = page_count
return context return context
@hooks.register('construct_homepage_summary_items') @hooks.register("construct_homepage_summary_items")
def add_corrected_pages_summary_panel(request, items): def add_corrected_pages_summary_panel(request, items):
"""Replaces the Pages summary panel to hide variants.""" """Replaces the Pages summary panel to hide variants."""
for index, item in enumerate(items): for index, item in enumerate(items):
@ -218,28 +226,39 @@ class SegmentSummaryPanel(SummaryItem):
site and allowing quick access to the Segment dashboard. site and allowing quick access to the Segment dashboard.
""" """
order = 2000 order = 2000
def render(self): def render(self):
segment_count = models.Segment.objects.count() segment_count = models.Segment.objects.count()
target_url = reverse('wagtail_personalisation_segment_modeladmin_index') target_url = reverse("wagtail_personalisation_segment_modeladmin_index")
title = _("Segments") title = _("Segments")
return mark_safe(""" return mark_safe(
"""
<li class="icon icon-fa-snowflake-o"> <li class="icon icon-fa-snowflake-o">
<a href="{}"><span>{}</span>{}</a> <a href="{}"><span>{}</span>{}</a>
</li>""".format(target_url, segment_count, title)) </li>""".format(
target_url, segment_count, title
)
)
class PersonalisedPagesSummaryPanel(PagesSummaryItem): class PersonalisedPagesSummaryPanel(PagesSummaryItem):
order = 2100 order = 2100
def render(self): def render(self):
page_count = models.PersonalisablePageMetadata.objects.filter(segment__isnull=True).count() page_count = models.PersonalisablePageMetadata.objects.filter(
segment__isnull=True
).count()
title = _("Personalised Page") title = _("Personalised Page")
return mark_safe(""" return mark_safe(
"""
<li class="icon icon-fa-file-o"> <li class="icon icon-fa-file-o">
<span>{}</span>{}{} <span>{}</span>{}{}
</li>""".format(page_count, title, pluralize(page_count))) </li>""".format(
page_count, title, pluralize(page_count)
)
)
class VariantPagesSummaryPanel(PagesSummaryItem): class VariantPagesSummaryPanel(PagesSummaryItem):
@ -247,15 +266,20 @@ class VariantPagesSummaryPanel(PagesSummaryItem):
def render(self): def render(self):
page_count = models.PersonalisablePageMetadata.objects.filter( page_count = models.PersonalisablePageMetadata.objects.filter(
segment__isnull=False).count() segment__isnull=False
).count()
title = _("Variant") title = _("Variant")
return mark_safe(""" return mark_safe(
"""
<li class="icon icon-fa-files-o"> <li class="icon icon-fa-files-o">
<span>{}</span>{}{} <span>{}</span>{}{}
</li>""".format(page_count, title, pluralize(page_count))) </li>""".format(
page_count, title, pluralize(page_count)
)
)
@hooks.register('construct_homepage_summary_items') @hooks.register("construct_homepage_summary_items")
def add_personalisation_summary_panels(request, items): def add_personalisation_summary_panels(request, items):
"""Adds a summary panel to the Wagtail dashboard showing the total amount """Adds a summary panel to the Wagtail dashboard showing the total amount
of segments on the site and allowing quick access to the Segment of segments on the site and allowing quick access to the Segment
@ -267,20 +291,21 @@ def add_personalisation_summary_panels(request, items):
items.append(VariantPagesSummaryPanel(request)) items.append(VariantPagesSummaryPanel(request))
@hooks.register('before_delete_page') @hooks.register("before_delete_page")
def delete_related_variants(request, page): def delete_related_variants(request, page):
if not isinstance(page, models.PersonalisablePageMixin) \ if (
or not page.personalisation_metadata.is_canonical: not isinstance(page, models.PersonalisablePageMixin)
or not page.personalisation_metadata.is_canonical
):
return return
# Get a list of related personalisation metadata for all the related # Get a list of related personalisation metadata for all the related
# variants. # variants.
variants_metadata = ( variants_metadata = page.personalisation_metadata.variants_metadata.select_related(
page.personalisation_metadata.variants_metadata "variant"
.select_related('variant')
) )
next_url = get_valid_next_url_from_request(request) next_url = get_valid_next_url_from_request(request)
if request.method == 'POST': if request.method == "POST":
parent_id = page.get_parent().id parent_id = page.get_parent().id
with transaction.atomic(): with transaction.atomic():
# To ensure variants are deleted for all descendants, start with # To ensure variants are deleted for all descendants, start with
@ -291,36 +316,36 @@ def delete_related_variants(request, page):
for metadata in PersonalisablePageMetadata.objects.filter( for metadata in PersonalisablePageMetadata.objects.filter(
canonical_page__in=page.get_descendants(inclusive=True), canonical_page__in=page.get_descendants(inclusive=True),
variant=F("canonical_page"), variant=F("canonical_page"),
).order_by('-canonical_page__depth'): ).order_by("-canonical_page__depth"):
for variant_metadata in metadata.variants_metadata.select_related('variant'): for variant_metadata in metadata.variants_metadata.select_related(
"variant"
):
# Call delete() on objects to trigger any signals or hooks. # Call delete() on objects to trigger any signals or hooks.
variant_metadata.variant.delete() variant_metadata.variant.delete()
metadata.delete() metadata.delete()
metadata.canonical_page.delete() metadata.canonical_page.delete()
msg = _("Page '{0}' and its variants deleted.") msg = _("Page '{0}' and its variants deleted.")
messages.success( messages.success(request, msg.format(page.get_admin_display_title()))
request,
msg.format(page.get_admin_display_title())
)
for fn in hooks.get_hooks('after_delete_page'): for fn in hooks.get_hooks("after_delete_page"):
result = fn(request, page) result = fn(request, page)
if hasattr(result, 'status_code'): if hasattr(result, "status_code"):
return result return result
if next_url: if next_url:
return redirect(next_url) return redirect(next_url)
return redirect('wagtailadmin_explore', parent_id) return redirect("wagtailadmin_explore", parent_id)
return render( return render(
request, request,
'wagtailadmin/pages/wagtail_personalisation/confirm_delete.html', { "wagtailadmin/pages/wagtail_personalisation/confirm_delete.html",
'page': page, {
'descendant_count': page.get_descendant_count(), "page": page,
'next': next_url, "descendant_count": page.get_descendant_count(),
'variants': Page.objects.filter( "next": next_url,
pk__in=variants_metadata.values_list('variant_id') "variants": Page.objects.filter(
) pk__in=variants_metadata.values_list("variant_id")
} ),
},
) )

13
tox.ini
View File

@ -1,8 +1,8 @@
[tox] [tox]
envlist = envlist =
flake8 flake8
py{36,37,38}-dj{22}-wt{25,26,27,28,29,210,211,212,213} py{36,37,38}-dj{22}-wt{211,212,213}
py{37,38}-dj{30,31}-wt{28,29,210,211,212,213} py{37,38}-dj{30,31}-wt{211,212,213}
[gh-actions] [gh-actions]
python = python =
@ -21,19 +21,10 @@ deps =
dj22: Django>=2.2.8,<2.3 dj22: Django>=2.2.8,<2.3
dj30: Django>=3.0,<3.1 dj30: Django>=3.0,<3.1
dj31: Django>=3.1,<3.2 dj31: Django>=3.1,<3.2
wt23: wagtail>=2.3,<2.4
wt24: wagtail>=2.4,<2.5
wt25: wagtail>=2.5,<2.6
wt26: wagtail>=2.6,<2.7
wt27: wagtail>=2.7,<2.8
wt28: wagtail>=2.8,<2.9
wt29: wagtail>=2.9,<2.10
wt210: wagtail>=2.10,<2.11
wt211: wagtail>=2.11,<2.12 wt211: wagtail>=2.11,<2.12
wt212: wagtail>=2.12,<2.13 wt212: wagtail>=2.12,<2.13
wt213: wagtail>=2.13,<2.14 wt213: wagtail>=2.13,<2.14
geoip2: geoip2 geoip2: geoip2
django111: django>=1.11,<1.12
[testenv:coverage-report] [testenv:coverage-report]
basepython = python3.6 basepython = python3.6

View File

@ -5867,9 +5867,9 @@ path-key@^2.0.0, path-key@^2.0.1:
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
path-parse@^1.0.6: path-parse@^1.0.6:
version "1.0.6" version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-type@^1.0.0: path-type@^1.0.0:
version "1.1.0" version "1.1.0"