Compare commits

...

26 Commits

Author SHA1 Message Date
Mark Dumay
0660a4c6e9 Merge pull request #942 from gethinode/image
Fix conversion of image dimensions
2024-05-20 09:00:30 +02:00
Mark Dumay
cba7768e39 Merge branch 'main' into image 2024-05-20 08:45:01 +02:00
Mark Dumay
a040ab42c3 Bump package release 2024-05-20 08:44:27 +02:00
Mark Dumay
fa6c01a380 Fix conversion of image dimensions 2024-05-20 08:43:49 +02:00
Mark Dumay
ed6c415bb2 Merge pull request #940 from gethinode/image
Add support for image CDNs
2024-05-19 19:03:48 +02:00
Mark Dumay
59c71d9bb2 Add initial alpha release 2024-05-19 18:56:57 +02:00
Mark Dumay
7dde1b3bb7 Merge branch 'main' into image 2024-05-19 18:55:48 +02:00
Mark Dumay
1d994fa1fe Add support for cloudinary images 2024-05-19 18:55:16 +02:00
Mark Dumay
5a9191fea5 Merge pull request #939 from gethinode/develop
Bump package release
2024-05-19 12:22:30 +02:00
Mark Dumay
790b3ac3d2 Merge branch 'main' into develop 2024-05-19 12:10:45 +02:00
Mark Dumay
f298dd2979 Bump package release 2024-05-19 12:10:20 +02:00
Mark Dumay
df7a7e2d3d Merge pull request #938 from vinser/link-external-attr
Add 'external' param to link shortcut
2024-05-19 11:59:18 +02:00
vinser
e28ca112de Add 'external' param to link shortcut 2024-05-19 13:28:21 +05:00
Mark Dumay
a34dc0f4a0 Merge pull request #936 from gethinode/develop
Fix link to Hugo download
2024-05-18 05:53:54 +02:00
Mark Dumay
3eb682b0d9 Merge branch 'main' into develop 2024-05-18 05:48:17 +02:00
Mark Dumay
d824ab39dd Fix link to Hugo download 2024-05-18 05:47:52 +02:00
Mark Dumay
5d27d602d2 Merge pull request #935 from gethinode/develop
Improve handling of links that include the site's base URL
2024-05-18 05:31:32 +02:00
Mark Dumay
66f3fd227b Merge branch 'main' into develop 2024-05-18 05:25:10 +02:00
Mark Dumay
e8f38fc73c Improve handling of links that include the site's base URL 2024-05-18 05:24:33 +02:00
github-actions[bot]
6f5756f3bf Merge pull request #933 from gethinode/dependabot/npm_and_yarn/hugo-bin-0.123.1
Bump hugo-bin from 0.122.8 to 0.123.1
2024-05-15 14:04:00 +00:00
dependabot[bot]
a56b1d6614 Bump hugo-bin from 0.122.8 to 0.123.1
Bumps [hugo-bin](https://github.com/fenneclab/hugo-bin) from 0.122.8 to 0.123.1.
- [Release notes](https://github.com/fenneclab/hugo-bin/releases)
- [Commits](https://github.com/fenneclab/hugo-bin/compare/v0.122.8...v0.123.1)

---
updated-dependencies:
- dependency-name: hugo-bin
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-15 13:56:58 +00:00
Mark Dumay
967492de76 Merge pull request #931 from gethinode/develop
Fix button layout of type link in horizontal stack
2024-05-13 16:42:21 +02:00
Mark Dumay
2b876fbb2e Merge branch 'main' into develop 2024-05-13 16:08:50 +02:00
Mark Dumay
8a0b0df3ff Fix button layout of type link in horizontal stack 2024-05-13 16:08:25 +02:00
github-actions[bot]
20f4e959d6 Merge pull request #930 from gethinode/dependabot/npm_and_yarn/rimraf-5.0.7
Bump rimraf from 5.0.5 to 5.0.7
2024-05-13 13:50:19 +00:00
dependabot[bot]
a46317f1d2 Bump rimraf from 5.0.5 to 5.0.7
Bumps [rimraf](https://github.com/isaacs/rimraf) from 5.0.5 to 5.0.7.
- [Changelog](https://github.com/isaacs/rimraf/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/rimraf/compare/v5.0.5...v5.0.7)

---
updated-dependencies:
- dependency-name: rimraf
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-13 13:42:00 +00:00
23 changed files with 671 additions and 489 deletions

View File

@@ -69,7 +69,7 @@ Hinode is a [Hugo theme that uses modules][hugo_modules] to install and maintain
The installation instructions in this readme install Hinode as a regular Hugo theme. Hinode requires the following software to be installed on your local machine.
- [Go binary][golang_download]
- [Hugo][nodejs] (extended version)
- [Hugo][hugo_download] (extended version)
[Git][git_download] is recommended, but is not a strict requirement.

View File

@@ -41,3 +41,7 @@ a.btn {
background-repeat: no-repeat if($enable-important-utilities, !important, null);
background-size: $btn-close-width if($enable-important-utilities, !important, null);
}
.btn-link {
--bs-btn-padding-x: 0;
}

View File

@@ -15,7 +15,7 @@ for = '/**'
https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com; \
font-src 'self' https://fonts.gstatic.com; \
frame-src 'self' https://www.youtube-nocookie.com https://www.youtube.com; \
img-src 'self' data: https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com https://tile.openstreetmap.org; \
img-src 'self' data: https://*.cloudinary.com https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com https://tile.openstreetmap.org; \
manifest-src 'self'; \
media-src 'self' \
"""

48
data/dimensions.yml Normal file
View File

@@ -0,0 +1,48 @@
- ratio: 4x3
dimensions:
- 576x432
- 768x576
- 992x744
- 1200x900
- 1400x1050
- 2800x2100
- ratio: 3x2
dimensions:
- 576x384
- 768x512
- 992x661
- 1200x800
- 1400x933
- 2800x1866
- ratio: 1x1
dimensions:
- 576x576
- 768x768
- 992x992
- 1200x1200
- 1400x1400
- 2800x2800
- ratio: 16x9
dimensions:
- 576x324
- 768x432
- 992x558
- 1200x675
- 1400x788
- 2800x1576
- ratio: 21x9
dimensions:
- 576x247
- 768x329
- 992x425
- 1200x514
- 1400x600
- 2800x1200
- ratio: auto
dimensions:
- 576
- 768
- 992
- 1200
- 1400
- 2800

View File

@@ -0,0 +1,62 @@
comment: >-
Defines the interface to be implemented by a CDN image adapter.
arguments:
host:
type: string
optional: true
comment: >-
Host of an URL. For example, the host of the URL
'https://example.com/first/second/third.webp' equals 'example.com'.
dir:
type: string
optional: true
comment: >-
All but the last element of an URL extension. For example, the dir of the
URL 'https://example.com/first/second/third.webp' equals '/first/second/'.
file:
type: string
optional: false
comment: >-
The last element of an URL extension. For example, the file of the
URL 'https://example.com/first/second/third.webp' equals 'third.webp'.
absoluteURL:
type: string
optional: true
default: false
comment: >-
Defines if a local image should use absolute instead of relative paths.
img:
type: "*resources.resourceAdapter"
optional: true
comment: >-
Image resource to process. Must be set when handling local images.
format:
type: select
optional: true
comment: >-
Image format; leave empty for an auto format (if supported) or default
format (usually jpg).
options:
values:
- png
- jpg
- gif
- tiff
- bmp
- webp
transform:
type: select
optional: false
comment: Image transformation.
options:
values:
- fill
- fit
height:
type: int
optional: false
comment: Height of the image in pixels.
width:
type: int
optional: false
comment: Width of the image in pixels.

View File

@@ -56,6 +56,12 @@ arguments:
Flag to indicate if the retrieved title (e.g. no inner text is provided)
of an internal link should use its original case. If false, the title is
set to lower case.
external:
type: bool
optional: true
default: false
comment: >-
Flag to indicate if a link that contains baseURL host should be forced as external.
class:
type: string
optional: true

View File

@@ -15,7 +15,7 @@ for = '/**'
https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com; \
font-src 'self' https://fonts.gstatic.com; \
frame-src 'self' https://www.youtube-nocookie.com https://www.youtube.com; \
img-src 'self' data: https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com https://tile.openstreetmap.org; \
img-src 'self' data: https://*.cloudinary.com https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com https://tile.openstreetmap.org; \
manifest-src 'self'; \
media-src 'self' \
"""

View File

@@ -291,6 +291,7 @@ As an example, the following shortcodes render links in different formats.
- {{</* link name=hinode cue=true tab=true >}}Named link opening in new tab with icon{{< /link */>}}
- {{</* link hinode /*/>}}
- {{</* link href="https://developer.mozilla.org" >}}External link{{< /link */>}}
- {{</* link href="https://demo.gethinode.com/en/about/" >}}Surrogate external link{{< /link */>}}
- {{</* link "./projects/another-project" >}}Internal link with title{{< /link */>}}
- {{</* link url="projects/another-project" /*/>}}
- {{</* link url="/projects/another-project" /*/>}}

View File

@@ -0,0 +1,24 @@
---
author: Mark Dumay
title: Local and remote images
date: 2024-05-19
description: Include responsive images from local sources and selected CDN image providers.
tags: ["blog"]
thumbnail:
url: https://res.cloudinary.com/demo/image/upload/v1689803100/ai/hiker.jpg
author: Nathan Dumlao
authorURL: https://unsplash.com/@nate_dumlao
origin: Unsplash
originURL: https://unsplash.com/photos/QLPWQvHvmII
---
## Cloudinary
As an example, the following shortcode displays an image with rounded corners and a 21x9 aspect ratio.
<!-- markdownlint-disable MD037 -->
{{< example lang="hugo" >}}
{{</* image src="https://res.cloudinary.com/demo/image/upload/dog.webp"
ratio="21x9" caption="Cloudinary image" class="rounded" */>}}
{{< /example >}}
<!-- markdownlint-enable MD037 -->

View File

@@ -93,6 +93,7 @@
"btn-close",
"btn-group",
"btn-light",
"btn-link",
"btn-outline-primary",
"btn-outline-secondary",
"btn-primary",
@@ -491,6 +492,7 @@
"carrousel",
"carte",
"chronologie",
"cloudinary",
"collapse",
"collapse-1",
"command-prompt",

View File

@@ -0,0 +1,43 @@
<!--
Copyright © 2024 The Hinode Team / Mark Dumay. All rights reserved.
Use of this source code is governed by The MIT License (MIT) that can be found in the LICENSE file.
Visit gethinode.com/license for more details.
-->
{{ $error := false }}
<!-- Validate arguments -->
{{ if partial "utilities/IsInvalidArgs.html" (dict "structure" "image-adapter" "args" . "group" "partial") }}
{{ errorf "partial [assets/adapter/cloudinary.html] - Invalid arguments" -}}
{{ $error = true }}
{{ end }}
<!-- Initialize arguments -->
{{ $host := .host }}
{{ $dir := .dir }}
{{ $file := .file }}
{{ $format := .format }}
{{ $transform := .transform }}
{{ $height := .height }}
{{ $width := .width }}
{{ if eq $transform "fill" }}{{ $transform = "c_fill" }}{{ else }}{{ $transform = "c_fit" }}{{ end }}
{{ $element := "" }}
<!-- Split path between upload dir and sub dir -->
{{ $newdir := urls.JoinPath (index (split $dir "upload") 0) "upload" }}
{{ $file = urls.JoinPath (index (split $dir "upload") 1) $file }}
{{ $dir = $newdir }}
<!-- Generate image URL -->
{{ if not $error }}
{{ $operation := "" }}
{{ if $format }}
{{ $operation = printf "%s,h_%d,w_%d" $transform $height $width }}
{{ $file = printf "%s.%s" (path.BaseName $file) $format }}
{{ else }}
{{ $operation = printf "f_auto,%s,h_%d,w_%d" $transform $height $width }}
{{ end }}
{{- $element = urls.JoinPath (slice "https://" $host $dir $operation $file) -}}
{{ end }}
{{ return $element }}

View File

@@ -0,0 +1,64 @@
<!--
Copyright © 2024 The Hinode Team / Mark Dumay. All rights reserved.
Use of this source code is governed by The MIT License (MIT) that can be found in the LICENSE file.
Visit gethinode.com/license for more details.
-->
{{ $error := false }}
<!-- Validate arguments -->
{{ if partial "utilities/IsInvalidArgs.html" (dict "structure" "image-adapter" "args" . "group" "partial") }}
{{ errorf "partial [assets/adapter/hugo.html] - Invalid arguments" -}}
{{ $error = true }}
{{ end }}
<!-- Initialize arguments -->
{{ $host := .host }}
{{ $dir := .dir }}
{{ $file := .file }}
{{ $img := .img }}
{{ $transform := .transform }}
{{ $height := .height }}
{{ $width := .width }}
{{ $element := "" }}
{{ $absoluteURL := .absoluteURL }}
{{ $url := urls.JoinPath $dir $file }}
{{ if $host }}
{{ $url = urls.JoinPath "https://" $host $url }}
{{ end }}
<!-- Initialize image if needed -->
{{ $format := .format | default "webp" }}
{{ if and (not $img) (ne $format "svg") }}
{{- $res := partial "utilities/GetImage.html" (dict "url" $url "page" page) -}}
{{ if $res }}
{{ $img = $res.resource }}
<!-- TODO: $res.mirror -->
{{ end }}
{{ if not $img }}
{{ errorf "partial [assets/adapter/hugo.html] - Expected 'img' argument" -}}
{{ $error = true }}
{{ end }}
{{ end }}
<!-- Process image and generate image URL -->
{{ if not $error }}
{{ $scaled := "" }}
{{ if eq $transform "fill" }}
{{- $scaled = $img.Fill (printf "%dx%d %s" $width $height $format) -}}
{{ else }}
{{- $scaled = $img.Fit (printf "%dx%d %s" $width $height $format) -}}
{{ end }}
{{- $clean := path.Ext $img.RelPermalink -}}
{{- $scaled = $scaled | resources.Copy (replace $img.RelPermalink $clean (printf "-%dx%d.%s" $width $height $format)) -}}
{{- if $absoluteURL -}}
{{- $element = $scaled.Permalink -}}
{{- else -}}
{{- $element = $scaled.RelPermalink -}}
{{- end -}}
{{ end }}
{{ return $element }}

View File

@@ -85,7 +85,7 @@
{{- with $clipboard }} data-clipboard="{{ $clipboard }}"{{ end -}}
{{- if eq $type "button" }} class="btn btn-{{ if $outline }}outline-{{ end }}{{ $color }} {{ if ne $size "md"}}btn-{{ $size }}{{ end }} position-relative {{ if in (slice "disabled" "active") $state }}{{ $state }}{{ end }} {{ $class -}}"
{{ if eq $state "disabled" }}aria-disabled="true"{{ end -}}
{{- else }} class="link-{{ $color }} position-relative {{ $class }}"{{ end -}}
{{- else }} class="btn btn-link link-{{ $color }} position-relative {{ $class }}"{{ end -}}
{{- with $tooltip }} data-bs-toggle="tooltip" data-bs-title="{{ . }}" data-bs-placement="{{ $placement }}"{{ end -}}
{{- with $collapse }} data-bs-toggle="collapse" aria-expanded="false" aria-controls="{{ . }}"{{ end -}}
{{- if eq $state "active" }} data-bs-toggle="button" aria-pressed="true"{{ end -}}

View File

@@ -0,0 +1,13 @@
<!--
Copyright © 2024 The Hinode Team / Mark Dumay. All rights reserved.
-->
{{ $ratio := .ratio }}
{{ $dim := "" }}
{{ $matches := first 1 (where site.Data.dimensions "ratio" $ratio) }}
{{ if eq ($matches | len) 1 }}
{{ $dim = (index $matches 0).dimensions }}
{{ end }}
{{ return $dim }}

View File

@@ -0,0 +1,23 @@
{{- $dim := .dim -}}
{{- $dimensions := slice }}
{{- $dimensions = $dimensions | append $dim -}}
{{- $portraits := slice }}
{{- range $d := $dimensions -}}
{{- $p := split $d "x" }}
{{ if ne (len $p) 2 }}
{{- warnf "partial [assets/image.html] - Invalid dimension: %s" $d -}}
{{- $portraits = $portraits | append $d -}}
{{- else -}}
{{- $portraits = $portraits | append (printf "%sx%s" (index $p 1) (index $p 0)) -}}
{{- end -}}
{{- end -}}
{{- $ret := "" }}
{{- if reflect.IsSlice $dim -}}
{{ $ret = $portraits -}}
{{- else if gt (len $portraits) 0 -}}
{{- $ret = index $portraits 0 -}}
{{- end -}}
{{- return $ret -}}

View File

@@ -0,0 +1,118 @@
<!-- Initialize arguments -->
{{- $page := .page -}}
{{- $ratio := .ratio -}}
{{- $portrait := .portrait -}}
{{- $wrapper := .wrapper -}}
{{- $class := .class -}}
{{- $title := .title -}}
{{- $caption := .caption -}}
{{- $figclass := .figclass -}}
{{- $lazy := .lazy -}}
{{- $priority := .priority -}}
{{- $sizes := .sizes -}}
{{- $absoluteURL := .absoluteURL -}}
{{- $url := .url -}}
{{- $mode := .mode -}}
{{- $modes := .modes -}}
{{- $fallbackURL := "" -}}
{{- $anchor := "" -}}
{{- $imgset := "" -}}
{{- $isVector := false -}}
<!-- Split url into base and anchor when applicable (only relevant for vector images) -->
{{- $segments := split $url "#" -}}
{{- if gt (len $segments) 2 -}}
{{- errorf "Invalid path or url: %q" $url -}}
{{- else if eq (len $segments) 2 }}
{{- $url = index $segments 0 -}}
{{- $anchor = index $segments 1 -}}
{{- end -}}
<!-- TODO: improve CDN detection / handling -->
{{ $hook := "hugo" }}
{{ if findRE "cloudinary" (urls.Parse $url).Hostname }}
{{ $hook = "cloudinary" }}
{{- end -}}
<!-- Define image dimensions -->
{{ $dims := slice }}
{{- $res := "" -}}
{{- $img := "" -}}
{{ $transform := "" }}
{{- if hasSuffix $url "svg" -}}
{{- $res = partial "utilities/GetResource.html" (dict "url" $url "page" $page) -}}
{{ if not $res }}
{{- if not (fileExists (path.Join "/static" $url)) -}}
{{ warnf "Cannot find vector image resource: %q" $url -}}
{{ else }}
{{ $width := string (partial "utilities/GetWidth.html" (dict "path" $url "height" 500)) }}
{{ $dims = $dims | append (printf "%sx500" $width) }}
{{ end }}
{{ end }}
{{ else if $ratio }}
{{ $transform = "fill" }}
{{ $dims = partial "assets/helpers/GetDimension.html" (dict "ratio" $ratio) }}
{{ if not $dims }}{{ errorf "partial [assets/image.html] - Cannot find dimension data: %s" $ratio }}{{ end }}
{{ else }}
{{ $transform = "fit" }}
{{- $res := partial "utilities/GetImage.html" (dict "url" $url "page" $page) -}}
{{ with $res }}
{{ $img = $res.resource }}
{{ if $res.mirror }}{{ $class = printf "%s mirrorred" $class }}{{ end }}
{{ end }}
{{ $widths := partial "assets/helpers/GetDimension.html" (dict "ratio" "auto") }}
{{ range $width := $widths -}}
{{- $dims = $dims | append (printf "%dx%d" (int $width) (int (math.Round (mul (div (float $width) $img.Width) $img.Height)))) -}}
{{- end -}}
{{ end }}
<!-- Derive image width and height -->
{{ $width := "" }}
{{ $height := "" }}
{{ range $dim := ($dims | last 1) }}
{{ $width = (int (index (split $dim "x") 0)) }}
{{ $height = (int (index (split $dim "x") 1)) }}
{{ end }}
<!-- Generate image urls -->
{{ if hasSuffix $url "svg" }}
{{- $fallbackURL = $url -}}
{{ else }}
{{- $fallbackURL = partial "assets/helpers/image-set.html" (dict "url" $url "img" $img "dims" ($dims | last 1) "transform" $transform "hook" $hook "format" "jpg" "includeWidth" false) -}}
{{- $imgset = partial "assets/helpers/image-set.html" (dict "url" $url "img" $img "dims" $dims "transform" $transform "hook" $hook) -}}
{{ end }}
<!-- Add color modes -->
{{- range $none := $modes -}}
{{- if ne $none $mode -}}
{{- $wrapper = printf "%s d-none-%s" (or $wrapper "") $none -}}
{{- end -}}
{{- end -}}
<!-- Generate image definition -->
{{- if $caption -}}
<figure {{ with $wrapper }}class="{{ . }}"{{ end }}>
{{ end }}
<div class="{{ if not $caption }}{{ $wrapper }}{{ end }}">
{{- if not $anchor -}}
<img class="img-fluid {{ $class }}"
src="{{ $fallbackURL }}"
{{ if $lazy }}loading="lazy"{{ end }}
{{ with $priority }}fetchpriority="{{ . }}"{{ end }}
{{ with $imgset -}}srcset="{{ . }}" sizes="{{ $sizes }}"{{- end }}
{{ with $height }}height="{{ . }}"{{ end }}
{{ with $width }}width="{{ . }}"{{ end }}
{{ with (or $title $caption) }}alt="{{ . }}"{{ end }}>
{{- else }}
<svg class="{{ $class }}">
<use href="{{ $fallbackURL }}#{{ $anchor }}"></use>
</svg>
{{ end }}
</div>
{{- if $caption -}}
<figcaption class="figure-caption{{ with $figclass }} {{ . }}{{ end }}">{{ $caption | safeHTML }}</figcaption>
</figure>
{{- end -}}

View File

@@ -0,0 +1,39 @@
{{- $url := .url -}}
{{ $img := .img }}
{{ $absoluteURL := .absoluteURL }}
{{ $dims := .dims }}
{{- $ratio := .ratio -}}
{{ $hook := .hook }}
{{ $transform := .transform }}
{{ $format := .format }}
{{ $includeWidth := .includeWidth | default true }}
{{ $host := (urls.Parse $url).Hostname }}
{{ $dir := (urls.Parse $url).Path }}
{{ $file := index ((split $dir "/") | collections.Reverse) 0 }}
{{ $dir = strings.TrimSuffix $file $dir }}
{{ $imgset := slice }}
{{- range $index, $dim := $dims -}}
{{ $width := (int (index (split $dim "x") 0)) }}
{{ $height := (int (index (split $dim "x") 1)) }}
{{- $element := partial (printf "assets/adapters/%s.html" $hook) (dict
"host" $host
"dir" $dir
"file" $file
"img" $img
"absoluteURL" $absoluteURL
"transform" $transform
"width" $width
"height" $height
"format" $format
)}}
{{ if $includeWidth }}
{{ $imgset = $imgset | append (printf "%s %dw" $element $width) }}
{{ else }}
{{ $imgset = $imgset | append $element }}
{{ end }}
{{- end -}}
{{ return (delimit $imgset ", ") }}

View File

@@ -13,250 +13,29 @@
{{ end }}
<!-- Initialize arguments -->
{{ $destination := .destination }}
<!-- Initialize arguments -->
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
{{- $page := .page -}}
{{- $ratio := .ratio -}}
{{- $portrait := .portrait -}}
{{- $url := .url -}}
{{- $mode := .mode -}}
{{- $modes := site.Params.main.modes | default (slice "light" "dark") -}}
{{- $wrapper := .wrapper -}}
{{- $class := .class -}}
{{- $title := .title -}}
{{- $caption := .caption -}}
{{- $figclass := .figclass -}}
{{- $page := .page -}}
{{- $loading := .loading -}}
{{- $lazy := eq $loading "lazy" -}}
{{- $priority := .priority -}}
{{- if eq $priority "auto" }}{{ $priority = "" }}{{ end -}}
{{- $sizes := .sizes | default "100vw" -}}
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
{{- $url := .url -}}
{{- $mode := .mode -}}
{{- $modes := site.Params.main.modes | default (slice "light" "dark") -}}
{{- define "partials/image-portrait.html" -}}
{{- $dimensions := slice }}
{{- $dim := .dim -}}
{{- $dimensions = $dimensions | append $dim -}}
{{- $portraits := slice }}
{{- range $d := $dimensions -}}
{{- $p := split $d "x" }}
{{ if ne (len $p) 2 }}
{{- warnf "partial [assets/image.html] - Invalid dimension: %s" $d -}}
{{- $portraits = $portraits | append $d -}}
{{- else -}}
{{- $portraits = $portraits | append (printf "%sx%s" (index $p 1) (index $p 0)) -}}
{{- end -}}
{{- end -}}
{{- $ret := "" }}
{{- if reflect.IsSlice $dim -}}
{{ $ret = $portraits -}}
{{- else if gt (len $portraits) 0 -}}
{{- $ret = index $portraits 0 -}}
{{- end -}}
{{- return $ret -}}
{{- end -}}
<!-- Generate a fallback image of type jpg -->
{{- define "partials/image-default.html" -}}
{{- $img := .img -}}
{{- $ratio := .ratio -}}
{{- $portrait := and .portrait .ratio -}}
{{- $width := "1400" -}}
{{- $dim := "" -}}
{{- $fallback := "" -}}
{{- with $img -}}
{{- if eq $ratio "4x3" -}}{{- $dim = "1400x1050" }}
{{- else if eq $ratio "3x2" -}}{{- $dim = "1400x933" }}
{{- else if eq $ratio "1x1" -}}{{- $dim = "1400x1400" }}
{{- else if eq $ratio "16x9" -}}{{- $dim = "1400x788" -}}
{{- else if eq $ratio "21x9" -}}{{- $dim = "1400x600" -}}
{{- else -}}
{{- $dim = printf "%sx%d" $width (int (math.Round (mul (div (float $width) $img.Width) $img.Height))) -}}
{{- end -}}
{{- if $portrait -}}{{- $dim = partial "partials/image-portrait.html" (dict "dim" $dim) -}}{{- end -}}
{{- if $ratio -}}
{{- $fallback = ($img.Fill (printf "%s jpg" $dim)) -}}
{{- else -}}
{{- $fallback = ($img.Fit (printf "%s jpg" $dim)) -}}
{{- end -}}
{{- $clean := path.Ext $img.RelPermalink -}}
{{- $ext := path.Ext $img.RelPermalink -}}
{{- $fallback = $fallback | resources.Copy (replace $img.RelPermalink $clean (printf "-%s%s" $dim $ext)) -}}
{{- end -}}
{{- return $fallback -}}
{{- end -}}
<!-- Generate a image set of type webp -->
{{- define "partials/image-scaled.html " -}}
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
{{- $img := .img -}}
{{- $ratio := .ratio -}}
{{- $portrait := and .portrait .ratio -}}
{{- $imgset := "" -}}
{{- $widths := slice "576" "768" "992" "1200" "1400" -}}
{{- $dims := slice -}}
{{- with $img -}}
{{- if eq $ratio "4x3" -}}
{{- $dims = slice "576x432" "768x576" "992x744" "1200x900" "1400x1050" -}}
{{- else if eq $ratio "3x2" -}}
{{- $dims = slice "576x384" "768x512" "992x661" "1200x800" "1400x933" -}}
{{- else if eq $ratio "1x1" -}}
{{- $dims = slice "576x576" "768x768" "992x992" "1200x1200" "1400x1400" -}}
{{- else if eq $ratio "16x9" -}}
{{- $dims = slice "576x324" "768x432" "992x558" "1200x675" "1400x788" -}}
{{- else if eq $ratio "21x9" -}}
{{- $dims = slice "576x247" "768x329" "992x425" "1200x514" "1400x600" -}}
{{- else -}}
{{- range $width := $widths -}}
{{- $dims = $dims | append (printf "%sx%d" $width (int (math.Round (mul (div (float $width) $img.Width) $img.Height)))) -}}
{{- end -}}
{{- end -}}
{{- if $portrait -}}
{{- $dims = partial "partials/image-portrait.html" (dict "dim" $dims) -}}
{{- end -}}
{{- $scaled := "" -}}
{{- range $index, $dim := $dims -}}
{{- $clean := path.Ext $img.RelPermalink -}}
{{- if $ratio -}}
{{- $scaled = $img.Fill (printf "%s webp" $dim) -}}
{{- else -}}
{{- $scaled = $img.Fit (printf "%s webp" $dim) -}}
{{- end -}}
{{- $scaled = $scaled | resources.Copy (replace $img.RelPermalink $clean (printf "-%s.webp" $dim)) -}}
{{- if $absoluteURL -}}
{{- $imgset = printf "%s, %s %sw" $imgset $scaled.Permalink (index $widths $index) -}}
{{- else -}}
{{- $imgset = printf "%s, %s %sw" $imgset $scaled.RelPermalink (index $widths $index) -}}
{{- end -}}
{{- end -}}
{{- $imgset = strings.TrimPrefix ", " $imgset -}}
{{- end -}}
{{- return $imgset -}}
{{- end -}}
<!-- Define the img with optional caption -->
{{- define "partials/image-definition.html" -}}
{{- $absoluteURL := site.Params.main.canonifyAssetsURLs | default false -}}
{{- $ratio := .ratio -}}
{{- $portrait := .portrait -}}
{{- $url := .url -}}
{{- $wrapper := .wrapper -}}
{{- $class := .class -}}
{{- $title := .title -}}
{{- $caption := .caption -}}
{{- $figclass := .figclass -}}
{{- $fallbackURL := "" -}}
{{- $anchor := "" -}}
{{- $imgset := "" -}}
{{- $mode := .mode -}}
{{- $modes := .modes -}}
{{- $lazy := .lazy -}}
{{- $page := .page -}}
{{- $sizes := .sizes -}}
{{- $priority := .priority -}}
{{- $isVector := false -}}
{{- $segments := split $url "#" -}}
{{- if gt (len $segments) 2 -}}
{{- errorf "Invalid path or url: %q" $url -}}
{{- else if eq (len $segments) 2 }}
{{- $url = index $segments 0 -}}
{{- $anchor = index $segments 1 -}}
{{- end -}}
{{- if hasSuffix $url "svg" -}}
{{- $fallbackURL = $url -}}
{{- $isVector = true -}}
{{- $res := partial "utilities/GetResource.html" (dict "url" $url "page" $page) -}}
{{ if not $res }}
{{- if not (fileExists (path.Join "/static" $url)) -}}
{{ warnf "Cannot find vector image resource: %q" $url -}}
{{ end }}
{{ end }}
{{- else -}}
{{- $res := partial "utilities/GetImage.html" (dict "url" $url "page" $page) -}}
{{- $img := "" -}}
{{ with $res }}
{{ $img = $res.resource }}
{{ if $res.mirror }}{{ $class = printf "%s mirrorred" $class }}{{ end }}
{{ end }}
{{- if $img -}}
{{- $fallback := partial "partials/image-default.html" (dict "img" $img "ratio" $ratio "portrait" $portrait) -}}
{{- if $absoluteURL -}}
{{- $fallbackURL = $fallback.Permalink -}}
{{- else -}}
{{- $fallbackURL = $fallback.RelPermalink -}}
{{- end -}}
{{- $imgset = partial "partials/image-scaled.html " (dict "img" $img "ratio" $ratio "portrait" $portrait) -}}
{{- end -}}
{{- end -}}
{{- range $none := $modes -}}
{{- if ne $none $mode -}}
{{- $wrapper = printf "%s d-none-%s" (or $wrapper "") $none -}}
{{- end -}}
{{- end -}}
{{- $width := "" -}}
{{- $height := "" -}}
{{- $input := (split (path.BaseName $fallbackURL) "-") | collections.Reverse -}}
{{ if $isVector }}
{{- $height = "500" -}}
{{ $width = string (partial "utilities/GetWidth.html" (dict "path" $fallbackURL "height" 500)) }}
{{- else if gt ($input | len) 1 -}}
{{- $dim := (split (index $input 0) "x") -}}
{{- if eq ($dim | len) 2 -}}
{{- $width = index $dim 0 -}}
{{- $height = index $dim 1 -}}
{{- end -}}
{{- end }}
{{- if $caption -}}
<figure {{ with $wrapper }}class="{{ . }}"{{ end }}>
{{ end }}
<div class="{{ if not $caption }}{{ $wrapper }}{{ end }}">
{{- if not $anchor -}}
<img class="img-fluid {{ $class }}"
src="{{ $fallbackURL }}"
{{ if $lazy }}loading="lazy"{{ end }}
{{ with $priority }}fetchpriority="{{ . }}"{{ end }}
{{ with $imgset -}}srcset="{{ . }}" sizes="{{ $sizes }}"{{- end }}
{{ with $height }}height="{{ . }}"{{ end }}
{{ with $width }}width="{{ . }}"{{ end }}
{{ with $title }}alt="{{ . }}"{{ end }}>
{{- else }}
<svg class="{{ $class }}">
<use href="{{ $fallbackURL }}#{{ $anchor }}"></use>
</svg>
{{ end }}
</div>
{{- if $caption -}}
<figcaption class="figure-caption{{ with $figclass }} {{ . }}{{ end }}">{{ $caption | safeHTML }}</figcaption>
</figure>
{{- end -}}
{{- end -}}
<!-- Initiate the regular or color-mode image -->
<!-- Main code -->
{{ $params := dict }}
{{- $params = merge $params (dict
"page" $page
"ratio" $ratio
"portrait" $portrait
"wrapper" $wrapper
@@ -267,7 +46,8 @@
"lazy" $lazy
"priority" $priority
"sizes" $sizes
"page" $page)
"absoluteURL" $absoluteURL
)
-}}
{{- if $mode -}}
@@ -284,9 +64,11 @@
"mode" $suffix
"modes" $modes)
-}}
{{- partial "partials/image-definition.html" $params -}}
{{- end -}}
{{ else }}
{{- $params = merge $params (dict "url" $url) -}}
{{- partial "partials/image-definition.html" $params -}}
{{- end -}}
{{ if not $error }}
{{- partial "assets/helpers/image-definition.html" $params -}}
{{ end }}

View File

@@ -13,14 +13,15 @@
{{ end }}
<!-- Initialize arguments -->
{{ $destination := .destination }}
{{ $destination := strings.TrimPrefix (strings.TrimSuffix "/" site.BaseURL) .destination }}
{{- $target := "" -}}
{{- $rel := "" -}}
{{- $case := .case | default true }}
{{- $external := .external | default false }}
{{- $cue := .cue | default site.Params.main.externalLinks.cue -}}
{{- $tab := .tab | default site.Params.main.externalLinks.tab -}}
{{- $isExternal := ne (urls.Parse (absURL $destination)).Host (urls.Parse site.BaseURL).Host -}}
{{- $isExternal := or (ne (urls.Parse (absURL $destination)).Host (urls.Parse site.BaseURL).Host) $external -}}
{{- $page := .page -}}
{{- $anchor := "" -}}
{{- $text := .text -}}

View File

@@ -18,6 +18,7 @@
{{ $url := "" }}
{{ $class := "" }}
{{ $case := true }}
{{ $external := false }}
{{ $cue := site.Params.main.externalLinks.cue }}
{{ $tab := site.Params.main.externalLinks.tab }}
{{ $text := trim .Inner " \r\n" | .Page.RenderString | safeHTML }}
@@ -30,6 +31,7 @@
{{- $cue = .Get "cue" | default site.Params.main.externalLinks.cue -}}
{{- $tab = .Get "tab" | default site.Params.main.externalLinks.tab -}}
{{- $case = .Get "case" | default true -}}
{{- $external = .Get "external" | default false -}}
{{- $class = .Get "class" | default "" -}}
{{ else }}
{{ $href = .Get 0 }}
@@ -42,7 +44,11 @@
{{ end }}
{{- if hasPrefix $href "http" -}}
{{ $url = $href }}
{{- if $external -}}
{{ $url = $href }}
{{- else -}}
{{ $url = strings.TrimPrefix (strings.TrimSuffix "/" site.BaseURL) $href }}
{{- end -}}
{{- else if not (strings.Contains $href "/") -}}
{{ $url = index site.Params.links $href }}
{{- end -}}
@@ -65,7 +71,12 @@
{{ end }}
{{ end }}
{{- $isExternal := ne (urls.Parse (absURL $url)).Host (urls.Parse site.BaseURL).Host -}}
{{ if and $external (not (hasPrefix $url "http")) }}
{{ errorf "External link must start with 'http': %s" .Position -}}
{{ $error = true -}}
{{ end }}
{{- $isExternal := or (ne (urls.Parse (absURL $url)).Host (urls.Parse site.BaseURL).Host) $external -}}
{{- if not $isExternal -}}
{{ $ref := partial "utilities/GetPage.html" (dict "url" $url "page" .Page) }}
{{- if not $ref -}}
@@ -80,5 +91,5 @@
<!-- Main code -->
{{- if not $error -}}
{{ partial "assets/link.html" (dict "destination" $url "text" $text "cue" $cue "tab" $tab "case" $case "class" $class "page" .Page) }}
{{ partial "assets/link.html" (dict "destination" $url "text" $text "cue" $cue "tab" $tab "case" $case "external" $external "class" $class "page" .Page) }}
{{- end -}}

View File

@@ -33,7 +33,7 @@
font-src 'self' https://*.netlify.app https://fonts.gstatic.com; \
frame-src 'self' https://www.youtube-nocookie.com https://www.youtube.com \
app.netlify.com; \
img-src 'self' data: https://*.netlify.app https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com https://tile.openstreetmap.org; \
img-src 'self' data: https://*.cloudinary.com https://*.netlify.app https://i.vimeocdn.com https://i.ytimg.com https://*.google-analytics.com https://*.googletagmanager.com https://tile.openstreetmap.org; \
manifest-src 'self'; \
media-src 'self' \
"""

431
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "@gethinode/hinode",
"version": "0.23.18",
"version": "0.24.0-alpha2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@gethinode/hinode",
"version": "0.23.18",
"version": "0.24.0-alpha2",
"license": "MIT",
"devDependencies": {
"@fullhuman/postcss-purgecss": "^6.0.0",
@@ -20,14 +20,14 @@
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-n": "^16.6.2",
"eslint-plugin-promise": "^6.1.1",
"hugo-bin": "0.122.8",
"hugo-bin": "0.123.1",
"markdownlint-cli2": "^0.13.0",
"netlify-plugin-hugo-cache-resources": "^0.2.1",
"npm-run-all": "^4.1.5",
"postcss-cli": "^11.0.0",
"purgecss-whitelister": "^2.4.0",
"replace-in-files-cli": "^2.2.0",
"rimraf": "^5.0.5",
"rimraf": "^5.0.7",
"shx": "^0.3.4",
"stylelint": "^16.5.0",
"stylelint-config-standard-scss": "^13.1.0"
@@ -830,139 +830,164 @@
"dev": true
},
"node_modules/@xhmikosr/archive-type": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/@xhmikosr/archive-type/-/archive-type-6.0.1.tgz",
"integrity": "sha512-PB3NeJL8xARZt52yDBupK0dNPn8uIVQDe15qNehUpoeeLWCZyAOam4vGXnoZGz2N9D1VXtjievJuCsXam2TmbQ==",
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@xhmikosr/archive-type/-/archive-type-7.0.0.tgz",
"integrity": "sha512-sIm84ZneCOJuiy3PpWR5bxkx3HaNt1pqaN+vncUBZIlPZCq8ASZH+hBVdu5H8znR7qYC6sKwx+ie2Q7qztJTxA==",
"dev": true,
"dependencies": {
"file-type": "^18.5.0"
"file-type": "^19.0.0"
},
"engines": {
"node": "^14.14.0 || >=16.0.0"
}
},
"node_modules/@xhmikosr/bin-check": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@xhmikosr/bin-check/-/bin-check-6.0.0.tgz",
"integrity": "sha512-ZUICVP4EchT0Dmz4/Xo7l3wuNF4Zo3ua8l00I/gkgF/59+1c/0+dijfokkIxN+4HScsAnGN9ej53mhnPcsdDYg==",
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/@xhmikosr/bin-check/-/bin-check-7.0.3.tgz",
"integrity": "sha512-4UnCLCs8DB+itHJVkqFp9Zjg+w/205/J2j2wNBsCEAm/BuBmtua2hhUOdAMQE47b1c7P9Xmddj0p+X1XVsfHsA==",
"dev": true,
"dependencies": {
"execa": "^5.1.1",
"isexe": "^2.0.0"
},
"engines": {
"node": "^14.14.0 || >=16.0.0"
"node": ">=18"
}
},
"node_modules/@xhmikosr/bin-wrapper": {
"version": "12.0.0",
"resolved": "https://registry.npmjs.org/@xhmikosr/bin-wrapper/-/bin-wrapper-12.0.0.tgz",
"integrity": "sha512-QMsHQ+ZIzzp4bSfytxRN33XMVEIljmU0M4MuEQ0zgk7agmZLYSGX4/OEFYpg4Xq08VwlhCCJ+8p+dMKL8WTa8g==",
"version": "13.0.5",
"resolved": "https://registry.npmjs.org/@xhmikosr/bin-wrapper/-/bin-wrapper-13.0.5.tgz",
"integrity": "sha512-DT2SAuHDeOw0G5bs7wZbQTbf4hd8pJ14tO0i4cWhRkIJfgRdKmMfkDilpaJ8uZyPA0NVRwasCNAmMJcWA67osw==",
"dev": true,
"dependencies": {
"@xhmikosr/bin-check": "^6.0.0",
"@xhmikosr/downloader": "^14.0.0",
"bin-version-check": "^5.1.0",
"os-filter-obj": "^2.0.0"
"@xhmikosr/bin-check": "^7.0.3",
"@xhmikosr/downloader": "^15.0.1",
"@xhmikosr/os-filter-obj": "^3.0.0",
"bin-version-check": "^5.1.0"
},
"engines": {
"node": ">=16"
"node": ">=18"
}
},
"node_modules/@xhmikosr/decompress": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/@xhmikosr/decompress/-/decompress-9.0.1.tgz",
"integrity": "sha512-9Lvlt6Qdpo9SaRQyRIXCo3lgU++eMZ68lzgjcTwtuKDrlwT635+5zsHZ1yrSx/Blc5IDuVLlPkBPj5CZkx+2+Q==",
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/@xhmikosr/decompress/-/decompress-10.0.1.tgz",
"integrity": "sha512-6uHnEEt5jv9ro0CDzqWlFgPycdE+H+kbJnwyxgZregIMLQ7unQSCNVsYG255FoqU8cP46DyggI7F7LohzEl8Ag==",
"dev": true,
"dependencies": {
"@xhmikosr/decompress-tar": "^7.0.0",
"@xhmikosr/decompress-tarbz2": "^7.0.0",
"@xhmikosr/decompress-targz": "^7.0.0",
"@xhmikosr/decompress-unzip": "^6.0.0",
"@xhmikosr/decompress-tar": "^8.0.1",
"@xhmikosr/decompress-tarbz2": "^8.0.1",
"@xhmikosr/decompress-targz": "^8.0.1",
"@xhmikosr/decompress-unzip": "^7.0.0",
"graceful-fs": "^4.2.11",
"make-dir": "^4.0.0",
"strip-dirs": "^3.0.0"
},
"engines": {
"node": "^14.14.0 || >=16.0.0"
"node": ">=18"
}
},
"node_modules/@xhmikosr/decompress-tar": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@xhmikosr/decompress-tar/-/decompress-tar-7.0.0.tgz",
"integrity": "sha512-kyWf2hybtQVbWtB+FdRyOT+jyR5jxCNZPLqvQGB7djZj75lrpLUPEmRbyo86AtJ5OEtivpYaNWjCkqSJ8xtRWw==",
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/@xhmikosr/decompress-tar/-/decompress-tar-8.0.1.tgz",
"integrity": "sha512-dpEgs0cQKJ2xpIaGSO0hrzz3Kt8TQHYdizHsgDtLorWajuHJqxzot9Hbi0huRxJuAGG2qiHSQkwyvHHQtlE+fg==",
"dev": true,
"dependencies": {
"file-type": "^18.5.0",
"is-stream": "^3.0.0",
"tar-stream": "^3.1.4"
"file-type": "^19.0.0",
"is-stream": "^2.0.1",
"tar-stream": "^3.1.7"
},
"engines": {
"node": "^14.14.0 || >=16.0.0"
"node": ">=18"
}
},
"node_modules/@xhmikosr/decompress-tarbz2": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@xhmikosr/decompress-tarbz2/-/decompress-tarbz2-7.0.0.tgz",
"integrity": "sha512-3QnjipYkRgh3Dee1MWDgKmANWxOQBVN4e1IwiGNe2fHYfMYTeSkVvWREt87UIoSucKUh3E95v8uGFttgTknZcA==",
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/@xhmikosr/decompress-tarbz2/-/decompress-tarbz2-8.0.1.tgz",
"integrity": "sha512-OF+6DysDZP5YTDO8uHuGG6fMGZjc+HszFPBkVltjoje2Cf60hjBg/YP5OQndW1hfwVWOdP7f3CnJiPZHJUTtEg==",
"dev": true,
"dependencies": {
"@xhmikosr/decompress-tar": "^7.0.0",
"file-type": "^18.5.0",
"is-stream": "^3.0.0",
"seek-bzip": "^1.0.6",
"@xhmikosr/decompress-tar": "^8.0.1",
"file-type": "^19.0.0",
"is-stream": "^2.0.1",
"seek-bzip": "^2.0.0",
"unbzip2-stream": "^1.4.3"
},
"engines": {
"node": "^14.14.0 || >=16.0.0"
"node": ">=18"
}
},
"node_modules/@xhmikosr/decompress-targz": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@xhmikosr/decompress-targz/-/decompress-targz-7.0.0.tgz",
"integrity": "sha512-7BNHJl92g9OLhw89zqcFS67V1LAtm4Ex02j6OiQzuE8P7Yy9lQcyBuEL3x6v436grLdL+BcFjgbmhWxnem4GHw==",
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/@xhmikosr/decompress-targz/-/decompress-targz-8.0.1.tgz",
"integrity": "sha512-mvy5AIDIZjQ2IagMI/wvauEiSNHhu/g65qpdM4EVoYHUJBAmkQWqcPJa8Xzi1aKVTmOA5xLJeDk7dqSjlHq8Mg==",
"dev": true,
"dependencies": {
"@xhmikosr/decompress-tar": "^7.0.0",
"file-type": "^18.5.0",
"is-stream": "^3.0.0"
"@xhmikosr/decompress-tar": "^8.0.1",
"file-type": "^19.0.0",
"is-stream": "^2.0.1"
},
"engines": {
"node": "^14.14.0 || >=16.0.0"
"node": ">=18"
}
},
"node_modules/@xhmikosr/decompress-unzip": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@xhmikosr/decompress-unzip/-/decompress-unzip-6.0.0.tgz",
"integrity": "sha512-R1HAkjXLS7RAL74YFLxYY9zYflCcYGssld9KKFDu87PnJ4h4btdhzXfSC8J5i5A2njH3oYIoCzx03RIGTH07Sg==",
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@xhmikosr/decompress-unzip/-/decompress-unzip-7.0.0.tgz",
"integrity": "sha512-GQMpzIpWTsNr6UZbISawsGI0hJ4KA/mz5nFq+cEoPs12UybAqZWKbyIaZZyLbJebKl5FkLpsGBkrplJdjvUoSQ==",
"dev": true,
"dependencies": {
"file-type": "^18.5.0",
"file-type": "^19.0.0",
"get-stream": "^6.0.1",
"yauzl": "^2.10.0"
"yauzl": "^3.1.2"
},
"engines": {
"node": "^14.14.0 || >=16.0.0"
"node": ">=18"
}
},
"node_modules/@xhmikosr/decompress-unzip/node_modules/yauzl": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.1.3.tgz",
"integrity": "sha512-JCCdmlJJWv7L0q/KylOekyRaUrdEoUxWkWVcgorosTROCFWiS9p2NNPE9Yb91ak7b1N5SxAZEliWpspbZccivw==",
"dev": true,
"dependencies": {
"buffer-crc32": "~0.2.3",
"pend": "~1.2.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@xhmikosr/downloader": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@xhmikosr/downloader/-/downloader-14.0.0.tgz",
"integrity": "sha512-qoKPKzGyoSZ7HxkKaMSFOA9dNnmow6nMNlOqoRvKkDvFhDVNjma6CBr/5o/oXtlQk+mEHxZWeHSNHHpWte4ApQ==",
"version": "15.0.1",
"resolved": "https://registry.npmjs.org/@xhmikosr/downloader/-/downloader-15.0.1.tgz",
"integrity": "sha512-fiuFHf3Dt6pkX8HQrVBsK0uXtkgkVlhrZEh8b7VgoDqFf+zrgFBPyrwCqE/3nDwn3hLeNz+BsrS7q3mu13Lp1g==",
"dev": true,
"dependencies": {
"@xhmikosr/archive-type": "^6.0.1",
"@xhmikosr/decompress": "^9.0.1",
"@xhmikosr/archive-type": "^7.0.0",
"@xhmikosr/decompress": "^10.0.1",
"content-disposition": "^0.5.4",
"defaults": "^2.0.2",
"defaults": "^3.0.0",
"ext-name": "^5.0.0",
"file-type": "^18.7.0",
"file-type": "^19.0.0",
"filenamify": "^6.0.0",
"get-stream": "^6.0.1",
"got": "^13.0.0"
},
"engines": {
"node": ">=16"
"node": ">=18"
}
},
"node_modules/@xhmikosr/os-filter-obj": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@xhmikosr/os-filter-obj/-/os-filter-obj-3.0.0.tgz",
"integrity": "sha512-siPY6BD5dQ2SZPl3I0OZBHL27ZqZvLEosObsZRQ1NUB8qcxegwt0T9eKtV96JMFQpIz1elhkzqOg4c/Ri6Dp9A==",
"dev": true,
"dependencies": {
"arch": "^3.0.0"
},
"engines": {
"node": "^14.14.0 || >=16.0.0"
}
},
"node_modules/accepts": {
@@ -1097,9 +1122,9 @@
}
},
"node_modules/arch": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
"integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/arch/-/arch-3.0.0.tgz",
"integrity": "sha512-AmIAC+Wtm2AU8lGfTtHsw0Y9Qtftx2YXEEtiBP10xFUtMOA+sHHx6OAddyL52mUKh1vsXQ6/w1mVDptZCyUt4Q==",
"dev": true,
"funding": [
{
@@ -1325,9 +1350,9 @@
}
},
"node_modules/b4a": {
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz",
"integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==",
"version": "1.6.6",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz",
"integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==",
"dev": true
},
"node_modules/balanced-match": {
@@ -1336,6 +1361,13 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
"node_modules/bare-events": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz",
"integrity": "sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==",
"dev": true,
"optional": true
},
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -1390,13 +1422,10 @@
}
},
"node_modules/bin-version-check/node_modules/semver": {
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"version": "7.6.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
"integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
@@ -2360,12 +2389,12 @@
"dev": true
},
"node_modules/defaults": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-2.0.2.tgz",
"integrity": "sha512-cuIw0PImdp76AOfgkjbW4VhQODRmNNcKR73vdCH5cLd/ifj7aamfoXvYgfGkEAjNJZ3ozMIy9Gu2LutUkGEPbA==",
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-3.0.0.tgz",
"integrity": "sha512-RsqXDEAALjfRTro+IFNKpcPCt0/Cy2FqHSIlnomiJp9YGadpQnrtbRpSgN2+np21qHcIKiva4fiOQGjS9/qR/A==",
"dev": true,
"engines": {
"node": ">=16"
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -3191,18 +3220,6 @@
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
"node_modules/execa/node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/express": {
"version": "4.19.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
@@ -3440,9 +3457,9 @@
}
},
"node_modules/file-type": {
"version": "18.7.0",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-18.7.0.tgz",
"integrity": "sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==",
"version": "19.0.0",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-19.0.0.tgz",
"integrity": "sha512-s7cxa7/leUWLiXO78DVVfBVse+milos9FitauDLG1pI7lNaJ2+5lzPnr2N24ym+84HVwJL6hVuGfgVE+ALvU8Q==",
"dev": true,
"dependencies": {
"readable-web-to-node-stream": "^3.0.2",
@@ -3450,7 +3467,7 @@
"token-types": "^5.0.1"
},
"engines": {
"node": ">=14.16"
"node": ">=18"
},
"funding": {
"url": "https://github.com/sindresorhus/file-type?sponsor=1"
@@ -3529,6 +3546,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/find-up-simple": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz",
"integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==",
"dev": true,
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/find-versions": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz",
@@ -4386,9 +4415,9 @@
"dev": true
},
"node_modules/hugo-bin": {
"version": "0.122.8",
"resolved": "https://registry.npmjs.org/hugo-bin/-/hugo-bin-0.122.8.tgz",
"integrity": "sha512-sdTfsr6awEchbTVzxV4XiajRsKirEf2au59PiNv4SJzygewDK6CPg5kmzcnjNnjnXWROGvtkBQWzLIUrbaxIOQ==",
"version": "0.123.1",
"resolved": "https://registry.npmjs.org/hugo-bin/-/hugo-bin-0.123.1.tgz",
"integrity": "sha512-YENQPHxg8jFvn5KyTrqUj+mXwGHNJzelc8TzzJ1l6Cm6ZSJsl38mdEKvejA8J1146h8Y6a2m6q6TsSx/5g3HRg==",
"dev": true,
"funding": [
{
@@ -4398,14 +4427,14 @@
],
"hasInstallScript": true,
"dependencies": {
"@xhmikosr/bin-wrapper": "^12.0.0",
"pkg-conf": "^4.0.0"
"@xhmikosr/bin-wrapper": "^13.0.5",
"package-config": "^5.0.0"
},
"bin": {
"hugo": "bin/cli.js"
},
"engines": {
"node": ">=16"
"node": ">=18"
}
},
"node_modules/human-signals": {
@@ -4849,12 +4878,12 @@
}
},
"node_modules/is-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
"integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true,
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -5317,13 +5346,10 @@
}
},
"node_modules/make-dir/node_modules/semver": {
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"version": "7.6.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
"integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
@@ -5846,9 +5872,9 @@
}
},
"node_modules/normalize-url": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
"integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==",
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz",
"integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==",
"dev": true,
"engines": {
"node": ">=14.16"
@@ -6205,18 +6231,6 @@
"node": ">= 0.8.0"
}
},
"node_modules/os-filter-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz",
"integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==",
"dev": true,
"dependencies": {
"arch": "^2.1.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/p-cancelable": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
@@ -6265,6 +6279,22 @@
"node": ">=6"
}
},
"node_modules/package-config": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/package-config/-/package-config-5.0.0.tgz",
"integrity": "sha512-GYTTew2slBcYdvRHqjhwaaydVMvn/qrGC323+nKclYioNSLTDUM/lGgtGTgyHVtYcozb+XkE8CNhwcraOmZ9Mg==",
"dev": true,
"dependencies": {
"find-up-simple": "^1.0.0",
"load-json-file": "^7.0.1"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/param-case": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
@@ -6450,104 +6480,6 @@
"node": ">=0.10.0"
}
},
"node_modules/pkg-conf": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz",
"integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==",
"dev": true,
"dependencies": {
"find-up": "^6.0.0",
"load-json-file": "^7.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-conf/node_modules/find-up": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
"integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
"dev": true,
"dependencies": {
"locate-path": "^7.1.0",
"path-exists": "^5.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-conf/node_modules/locate-path": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
"integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
"dev": true,
"dependencies": {
"p-locate": "^6.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-conf/node_modules/p-limit": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
"integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
"dev": true,
"dependencies": {
"yocto-queue": "^1.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-conf/node_modules/p-locate": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
"integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
"dev": true,
"dependencies": {
"p-limit": "^4.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-conf/node_modules/path-exists": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
"integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
"dev": true,
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/pkg-conf/node_modules/yocto-queue": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
"integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
"dev": true,
"engines": {
"node": ">=12.20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -8124,9 +8056,9 @@
}
},
"node_modules/rimraf": {
"version": "5.0.5",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz",
"integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==",
"version": "5.0.7",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz",
"integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==",
"dev": true,
"dependencies": {
"glob": "^10.3.7"
@@ -8135,7 +8067,7 @@
"rimraf": "dist/esm/bin.mjs"
},
"engines": {
"node": ">=14"
"node": ">=14.18"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -8277,18 +8209,27 @@
}
},
"node_modules/seek-bzip": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz",
"integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-2.0.0.tgz",
"integrity": "sha512-SMguiTnYrhpLdk3PwfzHeotrcwi8bNV4iemL9tx9poR/yeaMYwB9VzR1w7b57DuWpuqR8n6oZboi0hj3AxZxQg==",
"dev": true,
"dependencies": {
"commander": "^2.8.1"
"commander": "^6.0.0"
},
"bin": {
"seek-bunzip": "bin/seek-bunzip",
"seek-table": "bin/seek-bzip-table"
}
},
"node_modules/seek-bzip/node_modules/commander": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
"integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
"dev": true,
"engines": {
"node": ">= 6"
}
},
"node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
@@ -8326,13 +8267,10 @@
}
},
"node_modules/semver-truncate/node_modules/semver": {
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"version": "7.6.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
"integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
@@ -8636,13 +8574,16 @@
}
},
"node_modules/streamx": {
"version": "2.15.6",
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz",
"integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==",
"version": "2.16.1",
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz",
"integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==",
"dev": true,
"dependencies": {
"fast-fifo": "^1.1.0",
"queue-tick": "^1.0.1"
},
"optionalDependencies": {
"bare-events": "^2.2.0"
}
},
"node_modules/string_decoder": {
@@ -9342,9 +9283,9 @@
}
},
"node_modules/tar-stream": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz",
"integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==",
"version": "3.1.7",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
"integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
"dev": true,
"dependencies": {
"b4a": "^1.6.4",

View File

@@ -1,6 +1,6 @@
{
"name": "@gethinode/hinode",
"version": "0.23.18",
"version": "0.24.0-alpha2",
"description": "Hinode is a clean documentation and blog theme for Hugo, an open-source static site generator",
"keywords": [
"hugo",
@@ -78,14 +78,14 @@
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-n": "^16.6.2",
"eslint-plugin-promise": "^6.1.1",
"hugo-bin": "0.122.8",
"hugo-bin": "0.123.1",
"markdownlint-cli2": "^0.13.0",
"netlify-plugin-hugo-cache-resources": "^0.2.1",
"npm-run-all": "^4.1.5",
"postcss-cli": "^11.0.0",
"purgecss-whitelister": "^2.4.0",
"replace-in-files-cli": "^2.2.0",
"rimraf": "^5.0.5",
"rimraf": "^5.0.7",
"shx": "^0.3.4",
"stylelint": "^16.5.0",
"stylelint-config-standard-scss": "^13.1.0"