diff --git a/config.yml b/config.yml
index 638019c9e2..48b3bd44c3 100644
--- a/config.yml
+++ b/config.yml
@@ -40,10 +40,12 @@ module:
target: static/apple-touch-icon.png
- source: site/static/docs/5.0/assets/img/favicons/favicon.ico
target: static/favicon.ico
- # docsearch is referenced in a `script` tag so we just mount it in the static folder
+
+ # the following are processed via Hugo pipes so we need them in the assets folder
+ ## the following will be printed with Hugo pipes
- source: node_modules/docsearch.js/dist/cdn/docsearch.min.js
- target: static/docs/5.0/assets/js/vendor/docsearch.min.js
- # the following are concatenated via Hugo pipes with docs.js so we need them in the assets folder
+ target: assets/js/vendor/docsearch.min.js
+ ## The following vendor files will be bundled together on top of local js files as /docs.js
- source: node_modules/anchor-js/anchor.min.js
target: assets/js/vendor/anchor.min.js
- source: node_modules/bs-custom-file-input/dist/bs-custom-file-input.min.js
diff --git a/site/layouts/partials/func/get-js-assets.html b/site/layouts/partials/func/get-js-assets.html
new file mode 100644
index 0000000000..a7a27292e7
--- /dev/null
+++ b/site/layouts/partials/func/get-js-assets.html
@@ -0,0 +1,74 @@
+{{/*
+ get-js-assets
+ Returns a list of processed Hugo Assets to be used in templates
+
+ @author @regisphilibert
+
+ @context Page (.)
+
+ @access public
+
+ @example - Go Template
+ {{- range partialCached "func/get-js-assets" . $variant -}}
+
+ {{- end -}}
+*/}}
+
+{{/* We'll return a slice so templates can safely use `range` */}}
+{{ $jsAssets := slice }}
+
+{{/* Storing the reused mount warning message */}}
+{{ $missing_file_warning := "%s not found. Check your mounts settings." }}
+{{ $doc_version := site.Params.docs_version }}
+{{/* Doc Search */}}
+{{ if eq .Page.Layout "docs" -}}
+ {{ with resources.GetMatch "js/vendor/docsearch.min.js" }}
+ {{/* As this is a WIP, we don't customize the asset URL,
+ but we will after Hugo .74 and resources.Put (https://github.com/gohugoio/hugo/issues/7406):
+ {{ with resources.GetMatch "js/vendor/docsearch.min.js" }}
+ {{ $docsearch := . | resources.Put (printf /docs/%s/assets/js/vendor/docsearch.min.js" $doc_version) }}
+ {{ $jsAssets = $jsAssets | append $docsearch }}
+ */}}
+ {{ $jsAssets = $jsAssets | append . }}
+ {{ else }}
+ {{ warnf $missing_file_warning "docsearch.min.js" }}
+ {{ end }}
+{{- end }}
+
+{{/* --- Bundle */}}
+{{ $bundle := slice }}
+
+{{/* ----- Mounted from vendors */}}
+{{- $vendor_assets := slice -}}
+{{/* As we need to list the desired mounted files to:
+ 1. Check for missing mounts and throw an error
+ 2. Control order if need be
+ 3. Exclude docsearch (though there would be other ways) */}}
+{{ $vendor_filenames := slice "clipboard.min.js" "anchor.min.js" "bs-custom-file-input.min.js" }}
+{{ range $filename := $vendor_filenames }}
+ {{ with resources.GetMatch (print "js/vendor/" .) }}
+ {{ $vendor_assets = $vendor_assets | append . }}
+ {{ else }}
+ {{ warnf $missing_file_warning $filename }}
+ {{ end }}
+{{ end }}
+{{ with $vendor_assets }}
+ {{ $bundle = $bundle | append . }}
+{{ end }}
+
+{{/* ----- Local assets */}}
+{{ with resources.Match "js/*.js" }}
+ {{ $bundle = $bundle | append . }}
+{{ end }}
+
+{{/* Above code should have populated $bundle slice */}}
+{{ with $bundle }}
+ {{ $targetBundlePath := printf "/docs/%s/assets/js/docs.js" $doc_version }}
+ {{ $bundle_asset := $bundle | resources.Concat $targetBundlePath }}
+ {{ if eq hugo.Environment "production" }}
+ {{ $bundle_asset = $bundle_asset | resources.Minify }}
+ {{ end }}
+ {{ $jsAssets = $jsAssets | append $bundle_asset }}
+{{ end }}
+
+{{ return $jsAssets }}
diff --git a/site/layouts/partials/scripts.html b/site/layouts/partials/scripts.html
index be30d7a10d..f19a9b5825 100644
--- a/site/layouts/partials/scripts.html
+++ b/site/layouts/partials/scripts.html
@@ -4,17 +4,7 @@
{{- end }}
-{{ if eq .Page.Layout "docs" -}}
-
-{{- end }}
-
-{{- $vendor := resources.Match "js/vendor/*.js" -}}
-{{- $js := resources.Match "js/*.js" -}}
-{{- $targetDocsJSPath := printf "/docs/%s/assets/js/docs.js" .Site.Params.docs_version -}}
-{{- $docsJs := append $js $vendor | resources.Concat $targetDocsJSPath -}}
-
-{{- if eq hugo.Environment "production" -}}
- {{- $docsJs = $docsJs | resources.Minify -}}
-{{- end }}
-
-
+{{- $variant := cond (eq .Page.Layout "docs") "docs" "default" -}}
+{{- range partialCached "func/get-js-assets" . $variant -}}
+
+{{- end -}}