diff --git a/assets/js/search.js b/assets/js/search.js
new file mode 100644
index 00000000..a81fdf30
--- /dev/null
+++ b/assets/js/search.js
@@ -0,0 +1,113 @@
+/*
+Copyright 2018 Google LLC
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Local override of Docsy's search.js. Adds dual-mode support: the
+// pre-search mode picker (see layouts/_partials/search-input.html) stores
+// the user's choice, and the Enter-to-search redirect below carries it as
+// ?mode=ai so the results page opens directly in AI-assisted mode.
+// Standard search remains the default when nothing is stored.
+
+(function ($) {
+ 'use strict';
+
+ var STORAGE_KEY = 'interlisp-search-mode';
+
+ function getPreferredMode() {
+ try {
+ return window.localStorage.getItem(STORAGE_KEY) === 'ai' ? 'ai' : 'standard';
+ } catch (_) {
+ return 'standard';
+ }
+ }
+
+ function setPreferredMode(mode, skipEvent) {
+ try {
+ window.localStorage.setItem(STORAGE_KEY, mode === 'ai' ? 'ai' : 'standard');
+ } catch (_) {}
+ syncPickers(mode);
+ if (!skipEvent) {
+ // Notify the results-page toggle (vertex-search.js) on the same page.
+ try {
+ window.dispatchEvent(new CustomEvent('interlisp:search-mode-change', {
+ detail: { mode: mode }
+ }));
+ } catch (_) {}
+ }
+ }
+
+ function syncPickers(mode) {
+ var useAi = mode === 'ai';
+ var pickers = document.querySelectorAll('input.td-search-mode');
+ for (var i = 0; i < pickers.length; i++) {
+ pickers[i].checked = useAi;
+ var group = pickers[i].closest('.td-search-mode-switch');
+ if (group) {
+ var labels = group.querySelectorAll('.td-search-mode-label');
+ for (var j = 0; j < labels.length; j++) {
+ var active = labels[j].getAttribute('data-search-mode') === mode;
+ if (active) {
+ labels[j].classList.add('is-active');
+ } else {
+ labels[j].classList.remove('is-active');
+ }
+ }
+ }
+ }
+ }
+
+ var Search = {
+ init: function () {
+ $(document).ready(function () {
+ // Reflect the stored preference in every pre-search picker.
+ syncPickers(getPreferredMode());
+
+ $(document).on('change', 'input.td-search-mode', function () {
+ setPreferredMode($(this).is(':checked') ? 'ai' : 'standard');
+ });
+
+ // Side labels set an explicit mode (they must not merely toggle).
+ $(document).on('click', '.td-search-mode-label', function () {
+ setPreferredMode($(this).data('search-mode') === 'ai' ? 'ai' : 'standard');
+ });
+
+ $(document).on('keypress', '.td-search input', function (e) {
+ if (e.keyCode !== 13) {
+ return;
+ }
+
+ var query = $(this).val();
+ var params = new URLSearchParams();
+ params.set('q', query);
+ if (getPreferredMode() === 'ai') {
+ params.set('mode', 'ai');
+ }
+ var searchPage = '{{ "search/" | absURL }}?' + params.toString();
+ document.location = searchPage;
+
+ return false;
+ });
+ });
+ },
+ };
+
+ Search.init();
+
+ // Shared with vertex-search.js (results-page toggle).
+ window.interlispSearchMode = {
+ get: getPreferredMode,
+ set: setPreferredMode
+ };
+})(jQuery);
diff --git a/assets/js/vertex-search.js b/assets/js/vertex-search.js
new file mode 100644
index 00000000..7bec5908
--- /dev/null
+++ b/assets/js/vertex-search.js
@@ -0,0 +1,404 @@
+import { marked } from 'marked';
+import DOMPurify from 'dompurify';
+
+(function () {
+ 'use strict';
+
+ marked.setOptions({
+ gfm: true,
+ breaks: true
+ });
+
+ // Only run on the search results page
+ const config = document.getElementById('vertex-search-config');
+ if (!config) return;
+
+ const FUNCTION_URL = config.dataset.searchUrl;
+ if (!FUNCTION_URL) {
+ console.warn('Vertex search URL not configured');
+ return;
+ }
+
+ const statusEl = document.getElementById('vertex-search-status');
+ const hitsEl = document.getElementById('vertex-search-hits');
+ const summaryEl = document.getElementById('vertex-search-summary');
+ const summaryTxt = document.getElementById('summary-text');
+
+ // Dual-mode search: Standard (Google CSE, default) vs AI-assisted (Vertex).
+ const googleContainer = document.getElementById('google-search-container');
+ const vertexContainer = document.getElementById('vertex-search-container');
+ const standardRadio = document.getElementById('search-mode-standard');
+ const aiRadio = document.getElementById('search-mode-ai');
+
+ const aiAvailable = Boolean(FUNCTION_URL) && aiRadio && !aiRadio.disabled;
+ const standardAvailable = standardRadio && !standardRadio.disabled;
+
+ let lastAiQuery = null;
+
+ // Shared preference with the pre-search picker (assets/js/search.js).
+ // The explicit ?mode= URL param always wins; the stored value is only a
+ // fallback so a remembered choice applies to fresh searches.
+ const STORAGE_KEY = 'interlisp-search-mode';
+
+ function getStoredMode() {
+ if (window.interlispSearchMode) return window.interlispSearchMode.get();
+ try {
+ return window.localStorage.getItem(STORAGE_KEY) === 'ai' ? 'ai' : 'standard';
+ } catch (_) {
+ return 'standard';
+ }
+ }
+
+ function syncEntryPickers(mode) {
+ const useAi = mode === 'ai';
+ const pickers = document.querySelectorAll('input.td-search-mode');
+ for (let i = 0; i < pickers.length; i++) {
+ pickers[i].checked = useAi;
+ const group = pickers[i].closest('.td-search-mode-switch');
+ if (group) {
+ const labels = group.querySelectorAll('.td-search-mode-label');
+ for (let j = 0; j < labels.length; j++) {
+ const active = labels[j].getAttribute('data-search-mode') === mode;
+ if (active) {
+ labels[j].classList.add('is-active');
+ } else {
+ labels[j].classList.remove('is-active');
+ }
+ }
+ }
+ }
+ }
+
+ function publishMode(mode) {
+ // Store the user's explicit choice and reflect it in the navbar /
+ // sidebar pickers. skipEvent=true: this change originates here, so
+ // don't bounce the change event back.
+ if (window.interlispSearchMode) {
+ window.interlispSearchMode.set(mode, true);
+ } else {
+ try {
+ window.localStorage.setItem(STORAGE_KEY, mode);
+ } catch (_) {}
+ syncEntryPickers(mode);
+ }
+ }
+
+ function currentQuery() {
+ return new URLSearchParams(window.location.search).get('q') || '';
+ }
+
+ function setMode(mode, options) {
+ const updateUrl = !options || options.updateUrl !== false;
+ const useAi = mode === 'ai' && aiAvailable;
+
+ if (vertexContainer) vertexContainer.hidden = !useAi;
+ if (googleContainer) googleContainer.hidden = useAi;
+ if (aiRadio && standardRadio) {
+ (useAi ? aiRadio : standardRadio).checked = true;
+ }
+
+ if (updateUrl) {
+ const params = new URLSearchParams(window.location.search);
+ if (useAi) {
+ params.set('mode', 'ai');
+ } else {
+ params.delete('mode');
+ }
+ const next = `${window.location.pathname}?${params.toString()}`;
+ window.history.replaceState(null, '', next);
+ publishMode(useAi ? 'ai' : 'standard');
+ } else {
+ syncEntryPickers(useAi ? 'ai' : 'standard');
+ }
+
+ if (useAi) {
+ const q = currentQuery();
+ if (q !== lastAiQuery) {
+ doSearch(q);
+ }
+ }
+ }
+
+ function escapeHtml(str) {
+ if (!str) return '';
+ return str
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"')
+ .replace(/'/g, ''');
+ }
+
+ // Allowlist http(s) URLs only. Prevents `javascript:` / `data:` payloads
+ // from backend or index content becoming clickable links.
+ function safeHttpUrl(raw) {
+ try {
+ const u = new URL(raw, window.location.origin);
+ return (u.protocol === 'http:' || u.protocol === 'https:') ? u.toString() : null;
+ } catch (_) {
+ return null;
+ }
+ }
+
+ function renderSummaryMarkdown(summaryText, citationCount) {
+ const linkedMarkdown = (summaryText || '').replace(/\[(\d+)\]/g, (_, num) => {
+ const index = Number(num);
+ if (!Number.isInteger(index) || index < 1 || index > citationCount) return `[${num}]`;
+ return `[${num}](#source-row-${index})`;
+ });
+
+ const html = marked.parse(linkedMarkdown);
+ return DOMPurify.sanitize(html, {
+ ALLOWED_TAGS: [
+ 'a', 'p', 'ul', 'ol', 'li', 'strong', 'em', 'code', 'pre',
+ 'blockquote', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'br'
+ ],
+ ALLOWED_ATTR: ['href', 'title', 'target', 'rel', 'id', 'class']
+ });
+ }
+
+ function renderResultSnippet(snippetText, result) {
+ if (!snippetText) return '';
+ const normalized = normalizeSnippetText(snippetText, result);
+ const html = marked.parse(normalized);
+ return DOMPurify.sanitize(html, {
+ ALLOWED_TAGS: ['p', 'b', 'strong', 'em', 'code', 'pre', 'br', 'ul', 'ol', 'li', 'a'],
+ ALLOWED_ATTR: ['href', 'title', 'target', 'rel']
+ });
+ }
+
+ function decodeHtmlEntities(text) {
+ const textarea = document.createElement('textarea');
+ textarea.innerHTML = String(text || '');
+ return textarea.value;
+ }
+
+ function normalizeSnippetText(text, result) {
+ let output = decodeHtmlEntities(text);
+
+ // Repair malformed highlight markers like "bIssue/b" or "bmedley issues/b".
+ output = output.replace(/(^|[\s(\[{])b([^\n]{1,120}?)\/b(?=[\s)\]}.,;:!?]|$)/gi,
+ (match, prefix, value) => `${prefix}${value.trim()} `);
+
+ // Repair specific backend artifact where stripped highlight markers
+ // leak into URLs (e.g. "https://bgithub/b.com/Interlisp/bmedley/b/...").
+ // Intentionally narrow: generic "/b" rewrites corrupt legitimate URLs
+ // like https://blog.example.com, so only fix the known corrupted domain
+ // here. GitHub issue links are fully reconstructed in
+ // normalizeGithubIssueMentions() below.
+ output = output
+ .replace(/https:\/\/bgithub\/b\.com/gi, 'https://github.com')
+ .replace(/\s*\.\.\.\s*/g, ' ');
+
+ output = normalizeGithubIssueMentions(output, result);
+
+ // Drop noisy raw URL tails often appended by snippet extraction.
+ output = output.replace(/https?:\/\/\S+$/i, '');
+
+ // Normalize whitespace for cleaner one-line snippets.
+ output = output.replace(/\s+/g, ' ').trim();
+ return output;
+ }
+
+ function normalizeGithubIssueMentions(text, result) {
+ const repo = result?.repo;
+ if (!repo) return text;
+
+ // Fix malformed markdown links like: [Issue 609](https://bgithub/b.com/Interlisp/bmedley/b/bissues/b/609)
+ let output = text.replace(
+ /\[(Issue\s+#?\d+)\]\((https?:\/\/[^)]+)\)/gi,
+ (match, label, rawUrl) => {
+ const issueNumberMatch = label.match(/(\d+)/);
+ if (!issueNumberMatch) return match;
+ const issueNumber = issueNumberMatch[1];
+ const cleanUrl = `https://github.com/Interlisp/${repo}/issues/${issueNumber}`;
+ return `[${label}](${cleanUrl})`;
+ }
+ );
+
+ // Convert plain text mentions like "Issue 609" or "Issue #609" into links.
+ output = output.replace(/\bIssue\s+#?(\d+)\b/g, (match, num) => {
+ const issueUrl = `https://github.com/Interlisp/${repo}/issues/${num}`;
+ return `[Issue ${num}](${issueUrl})`;
+ });
+
+ return output;
+ }
+
+ function formatDisplayUrl(rawUrl) {
+ if (!rawUrl) return '';
+
+ try {
+ const parsed = new URL(rawUrl);
+ const host = parsed.host.replace(/^www\./, '');
+ const pathSegments = parsed.pathname.split('/').filter(Boolean);
+ const path = pathSegments.length > 0 ? ` › ${pathSegments.join(' › ')}` : '';
+ return `${host}${path}`;
+ } catch (_) {
+ return rawUrl;
+ }
+ }
+
+ async function doSearch(q) {
+ lastAiQuery = q;
+ if (!q) {
+ statusEl.textContent = 'Enter a search query above.';
+ statusEl.style.display = '';
+ return;
+ }
+
+ // Update page title to reflect query
+ document.title = `Search: ${q}`;
+ statusEl.style.display = '';
+ statusEl.innerHTML = ' Searching for ' +
+ escapeHtml(q) + ' …';
+
+ try {
+ const url = new URL(FUNCTION_URL);
+ url.searchParams.set('q', q);
+
+ // Pass referring section as context if coming from a content page
+ const ref = document.referrer;
+ if (ref) {
+ try {
+ const refPath = new URL(ref).pathname.split('/').filter(Boolean);
+ if (refPath.length > 0) url.searchParams.set('context', refPath[0]);
+ } catch (_) {}
+ }
+
+ const resp = await fetch(url.toString());
+ if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
+ const data = await resp.json();
+
+ // Hide spinner
+ statusEl.style.display = 'none';
+
+ // Show AI summary if available
+ if (data.summary?.summaryText) {
+ const refs = data.summary?.citations || [];
+ const validRefs = refs.filter(r => r.title || r.uri);
+
+ summaryTxt.innerHTML = renderSummaryMarkdown(data.summary.summaryText, validRefs.length);
+
+ const inlineRefs = summaryTxt.querySelectorAll('a[href^="#source-row-"]');
+ inlineRefs.forEach((el) => {
+ el.classList.add('summary-inline-citation');
+ el.setAttribute('aria-label', `Jump to source ${el.textContent}`);
+ });
+
+ summaryEl.style.display = 'block';
+
+ // Remove stale source rows before rendering the latest list.
+ const previousCitations = summaryEl.querySelector('.search-citations');
+ if (previousCitations) previousCitations.remove();
+
+ if (validRefs.length > 0) {
+ const citationHtml = validRefs.map((ref, i) => {
+ const safeUri = ref.uri ? safeHttpUrl(ref.uri) : null;
+ const label = escapeHtml(ref.title || ref.uri || 'Unknown source');
+ const linkOrText = safeUri
+ ? `${label} `
+ : `${label} `;
+ return `
+
+ [${i + 1}]
+ ${linkOrText}
+
+ `;
+ }).join('');
+
+ const citationsDiv = document.createElement('div');
+ citationsDiv.className = 'search-citations mt-3';
+ citationsDiv.innerHTML = 'Sources
' + citationHtml;
+ summaryEl.querySelector('.ai-summary').appendChild(citationsDiv);
+ }
+ } else {
+ summaryTxt.innerHTML = '';
+ summaryEl.style.display = 'none';
+ }
+
+ // Show results
+ if (!data.results || data.results.length === 0) {
+ hitsEl.innerHTML = `No results found for ${escapeHtml(q)} .
`;
+ return;
+ }
+
+ // Show result count
+ hitsEl.innerHTML =
+ `${data.results.length} results for ${escapeHtml(q)}
` +
+ data.results.map(r => {
+ const safeUrl = r.url ? safeHttpUrl(r.url) : null;
+ const title = escapeHtml(r.title || 'Untitled');
+ const titleHtml = safeUrl
+ ? `${title} `
+ : `${title} `;
+ return `
+
+
+ ${titleHtml}
+
+
${escapeHtml(formatDisplayUrl(r.url))}
+ ${r.snippet ? `
${renderResultSnippet(r.snippet, r)}
` : ''}
+ ${(r.type || r.repo || r.state)
+ ? `
+ ${r.type ? `${escapeHtml(r.type)} ` : ''}
+ ${r.repo ? `${escapeHtml(r.repo)} ` : ''}
+ ${r.state ? `${escapeHtml(r.state)} ` : ''}
+
`
+ : ''}
+
+ `;
+ }).join('');
+
+ } catch (err) {
+ statusEl.textContent = 'Search error: ' + err.message;
+ console.error('Vertex search error:', err);
+ }
+ }
+
+ // Standard search is the default; AI search only runs when toggled on
+ // (or when the URL carries ?mode=ai). This avoids Vertex cost/latency
+ // for users who never opt in.
+ function initMode() {
+ const params = new URLSearchParams(window.location.search);
+ const modeParam = params.get('mode');
+ // Explicit ?mode= wins; otherwise fall back to the remembered
+ // pre-search choice, defaulting to Standard.
+ const wantsAi = modeParam === 'ai' || (modeParam === null && getStoredMode() === 'ai');
+
+ if (!aiAvailable || !standardAvailable) {
+ // Only one backend configured: lock to it.
+ setMode(aiAvailable ? 'ai' : 'standard', { updateUrl: false });
+ return;
+ }
+
+ setMode(wantsAi ? 'ai' : 'standard', { updateUrl: false });
+ }
+
+ // Follow pre-search picker changes made elsewhere on this page
+ // (navbar / sidebar), e.g. while viewing the results page.
+ window.addEventListener('interlisp:search-mode-change', (e) => {
+ if (e && e.detail && (e.detail.mode === 'ai' || e.detail.mode === 'standard')) {
+ setMode(e.detail.mode);
+ }
+ });
+
+ if (standardRadio) {
+ standardRadio.addEventListener('change', () => {
+ if (standardRadio.checked) setMode('standard');
+ });
+ }
+ if (aiRadio) {
+ aiRadio.addEventListener('change', () => {
+ if (aiRadio.checked) setMode('ai');
+ });
+ }
+
+ // Run search on page load
+ if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', initMode);
+ } else {
+ initMode();
+ }
+
+})();
\ No newline at end of file
diff --git a/assets/scss/_styles_project.scss b/assets/scss/_styles_project.scss
index 7f05b07e..bcd774f4 100644
--- a/assets/scss/_styles_project.scss
+++ b/assets/scss/_styles_project.scss
@@ -93,3 +93,246 @@
padding: 0.5rem 0;
}
}
+
+// Search mode toggle (Standard vs AI-assisted)
+.search-mode-toggle {
+ .btn {
+ font-size: 0.875rem;
+ }
+}
+
+// Pre-search mode picker: a "Standard [switch] AI" control on its own row,
+// centered under the search box in both the navbar and the sidebar.
+// The switch takes a full flex row; in the sidebar the section-nav collapse
+// button is explicitly ordered ahead of it so the first row stays
+// [search box] [collapse button].
+.td-navbar__search {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+}
+
+.td-navbar__search,
+.td-sidebar__search {
+ .td-search {
+ flex: 1 1 10rem;
+ min-width: 0;
+ width: auto;
+ }
+}
+
+.td-sidebar__search {
+ flex-wrap: wrap;
+ gap: 0.5rem;
+
+ .td-sidebar__toggle {
+ order: 1;
+ }
+}
+
+// Flanking-label switch: "Standard [switch] AI", centered below the box.
+.td-search-mode-switch {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex: 0 0 100%;
+ order: 2;
+ gap: 0.375rem;
+
+ .form-check {
+ margin-bottom: 0;
+ min-height: 0;
+ display: inline-flex;
+ align-items: center;
+ }
+}
+
+.td-search-mode-label {
+ background: none;
+ border: none;
+ padding: 0;
+ font-size: 0.8rem;
+ line-height: 1.2;
+ color: inherit;
+ opacity: 0.65;
+ cursor: pointer;
+ white-space: nowrap;
+
+ &:hover {
+ opacity: 1;
+ text-decoration: underline;
+ }
+
+ &.is-active {
+ opacity: 1;
+ font-weight: 600;
+ }
+}
+
+// Vertex AI Search styles
+.ai-summary {
+ background: #f0f7ff;
+ border-left: 4px solid #1a73e8;
+ padding: 1rem 1.25rem;
+ margin-bottom: 1.5rem;
+ border-radius: 0 4px 4px 0;
+
+ .ai-badge {
+ font-size: 0.75rem;
+ font-weight: 600;
+ color: #1a73e8;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ display: block;
+ margin-bottom: 0.5rem;
+ }
+
+ p { margin: 0 0 0.75rem; }
+
+ p:last-child {
+ margin-bottom: 0;
+ }
+
+ ul,
+ ol {
+ margin: 0.5rem 0 0.75rem 1.25rem;
+ }
+
+ li {
+ margin-bottom: 0.35rem;
+ }
+
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6 {
+ margin: 0.9rem 0 0.5rem;
+ font-size: 1rem;
+ font-weight: 700;
+ color: #124fa8;
+ }
+
+ code {
+ color: #0b4aa2;
+ background: rgba(26, 115, 232, 0.1);
+ border-radius: 3px;
+ padding: 0 0.2rem;
+ }
+}
+
+.summary-inline-citation {
+ margin-left: 0.1rem;
+ text-decoration: none;
+ font-weight: 600;
+ color: #1a73e8;
+
+ &:hover,
+ &:focus {
+ text-decoration: underline;
+ }
+}
+
+.td-search-hit {
+ padding: 1rem 0;
+ border-bottom: 1px solid #e8e8e8;
+
+ &:last-child { border-bottom: none; }
+
+ &__title {
+ margin: 0 0 0.25rem;
+ font-size: 1rem;
+ line-height: 1.35;
+ a {
+ color: #1a0dab;
+ text-decoration: none;
+ }
+
+ a:hover,
+ a:focus {
+ text-decoration: underline;
+ }
+ }
+
+ &__snippet {
+ font-size: 0.875rem;
+ color: #545454;
+ margin: 0.25rem 0;
+
+ p {
+ margin: 0 0 0.4rem;
+ }
+
+ p:last-child {
+ margin-bottom: 0;
+ }
+
+ b,
+ strong {
+ color: #1f1f1f;
+ font-weight: 700;
+ }
+ }
+
+ &__url {
+ color: #0b8043;
+ margin: 0;
+ word-break: break-word;
+ }
+
+ &__meta {
+ margin-top: 0.4rem;
+ }
+}
+
+.search-meta-chip {
+ display: inline-block;
+ margin-right: 0.35rem;
+ margin-bottom: 0.2rem;
+ padding: 0.08rem 0.45rem;
+ font-size: 0.72rem;
+ border-radius: 999px;
+ background: #eef2f7;
+ color: #4a5568;
+ border: 1px solid #dde3eb;
+}
+
+.td-search-loading,
+.td-search-no-results,
+.td-search-error {
+ padding: 1rem 0;
+ color: #666;
+}
+
+.search-citations {
+ border-top: 1px solid #d0e4ff;
+ padding-top: 0.75rem;
+ margin-top: 0.75rem;
+
+ .citations-label {
+ font-size: 0.7rem;
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ color: #1a73e8;
+ margin-bottom: 0.4rem;
+ }
+ }
+
+ .search-citation {
+ font-size: 0.8rem;
+ margin-bottom: 0.25rem;
+
+ .citation-number {
+ color: #1a73e8;
+ font-weight: 600;
+ margin-right: 0.4rem;
+ }
+
+ a {
+ color: #444;
+ &:hover { color: #1a73e8; }
+ }
+ }
\ No newline at end of file
diff --git a/config/_default/params.yaml b/config/_default/params.yaml
index d1957ff6..3125f763 100644
--- a/config/_default/params.yaml
+++ b/config/_default/params.yaml
@@ -57,6 +57,9 @@ copyright:
# gcs_engine_id: search engine
gcs_engine_id: 33ef4cbe0703b4f3a
+# Vertex AI Search Cloud Function URL
+vertex_search_url: "https://us-central1-interlispsearch.cloudfunctions.net/search"
+
# Zotero Group ID for bibliography management
zotero_group_id: 2914042
diff --git a/layouts/_partials/hooks/head-end.html b/layouts/_partials/hooks/head-end.html
index 14f526e3..4d3dd5ec 100644
--- a/layouts/_partials/hooks/head-end.html
+++ b/layouts/_partials/hooks/head-end.html
@@ -1,5 +1,8 @@
+
+{{ $searchJS := resources.Get "js/vertex-search.js" | js.Build | fingerprint }}
+
{{- /* Emit a page-level robots directive when front matter sets `robots`.
Docsy's head.html already emits "index, follow" for production pages;
when both tags are present, search engines apply the most restrictive
diff --git a/layouts/_partials/search-input.html b/layouts/_partials/search-input.html
new file mode 100644
index 00000000..6a3a1cb7
--- /dev/null
+++ b/layouts/_partials/search-input.html
@@ -0,0 +1,86 @@
+{{/* cSpell:ignore docsy docsearch absurlreplacer */ -}}
+
+{{/* Local override of Docsy's search-input partial. Adds a pre-search
+ Standard / AI-assisted mode picker next to the search box when both
+ backends are configured. The picker's value is stored (localStorage)
+ and honored by assets/js/search.js on redirect, and stays in sync
+ with the results-page toggle in layouts/search.html. */ -}}
+
+{{ .Scratch.Set "docsy-search" 0 -}}
+
+{{ if .Site.Params.gcs_engine_id -}}
+{{ .Scratch.Add "docsy-search" 1 -}}
+
+
+
+{{- end -}}
+
+
+{{ if and .Site.Params.search (isset .Site.Params.search "algolia") -}}
+{{ .Scratch.Add "docsy-search" 1 -}}
+{{ .Scratch.Add "docsearch-id-num" 1 -}}
+
+
+
+{{- end -}}
+
+
+{{ if .Site.Params.offlineSearch -}}
+{{ .Scratch.Add "docsy-search" 1 -}}
+
+{{ $offlineSearchIndex := resources.Get "json/offline-search-index.json" | resources.ExecuteAsTemplate "offline-search-index.json" . -}}
+{{ if hugo.IsProduction -}}
+{{/* Use `md5` as finger print hash function to shorten file name to avoid `file name too long` error. */ -}}
+{{ $offlineSearchIndex = $offlineSearchIndex | fingerprint "md5" -}}
+{{ end -}}
+{{ $offlineSearchLink := $offlineSearchIndex.RelPermalink -}}
+
+
+
+{{- end -}}
+
+{{ if and .Site.Params.gcs_engine_id .Site.Params.vertex_search_url -}}
+
+{{- end -}}
+
+{{ if gt (.Scratch.Get "docsy-search") 1 -}}
+{{ warnf `You have more than one site-search option configured: choose only one.
+ For details, see https://www.docsy.dev/docs/content/search.` -}}
+{{ end -}}
diff --git a/layouts/search.html b/layouts/search.html
new file mode 100644
index 00000000..718f4b62
--- /dev/null
+++ b/layouts/search.html
@@ -0,0 +1,74 @@
+{{ define "main" }}
+
+
+
{{ .Title }}
+
+ {{ $gcsID := .Site.Params.gcs_engine_id }}
+ {{ $vertexURL := .Site.Params.vertex_search_url }}
+
+
+
+ {{/* Standard Google Custom Search (currently deployed behavior, default) */}}
+
+ {{ with $gcsID -}}
+
+
+ {{ else -}}
+
Standard search is not configured.
+ {{ end -}}
+
+
+ {{/* AI-assisted Vertex search (only active when toggled on) */}}
+
+
+ {{/* Pass the function URL to JS */}}
+
+
+
+
+
+
+ Searching...
+
+
+
+
+
+
+
+{{ end }}
diff --git a/package-lock.json b/package-lock.json
index 82470702..e7a6b14c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2,6 +2,8 @@
"name": "Interlisp.github.io",
+ "version": "1.0.0",
+
"lockfileVersion": 2,
"requires": true,
@@ -10,12 +12,14 @@
"": {
- "name": "Interlisp.github.io",
-
"dependencies": {
+ "dompurify": "^3.3.1",
+
"jquery": "^3.7.1",
+ "marked": "^15.0.12",
+
"tabpanel": "^0.2.0"
},
@@ -44,6 +48,8 @@
"dev": true,
+ "license": "ISC",
+
"dependencies": {
"minipass": "^7.0.4"
@@ -68,6 +74,8 @@
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
@@ -94,6 +102,8 @@
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">= 8"
@@ -112,6 +122,8 @@
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
@@ -128,67 +140,35 @@
},
- "node_modules/adm-zip": {
-
- "version": "0.5.16",
-
- "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz",
-
- "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==",
-
- "dev": true,
-
- "engines": {
-
- "node": ">=12.0"
-
- }
-
- },
-
- "node_modules/ansi-regex": {
-
- "version": "5.0.1",
-
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "node_modules/@types/trusted-types": {
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "version": "2.0.7",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
- "engines": {
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
- "node": ">=8"
+ "license": "MIT",
- }
+ "optional": true
},
- "node_modules/ansi-styles": {
+ "node_modules/adm-zip": {
- "version": "4.3.0",
+ "version": "0.5.17",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==",
"dev": true,
- "dependencies": {
-
- "color-convert": "^2.0.1"
-
- },
+ "license": "MIT",
"engines": {
- "node": ">=8"
-
- },
-
- "funding": {
-
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">=12.0"
}
@@ -196,14 +176,16 @@
"node_modules/anymatch": {
- "version": "3.1.2",
+ "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
+ "license": "ISC",
+
"dependencies": {
"normalize-path": "^3.0.0",
@@ -222,11 +204,11 @@
"node_modules/autoprefixer": {
- "version": "10.4.8",
+ "version": "10.5.0",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz",
- "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==",
+ "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==",
"dev": true,
@@ -246,21 +228,29 @@
"url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+
+ {
+
+ "type": "github",
+
+ "url": "https://github.com/sponsors/ai"
+
}
],
- "dependencies": {
+ "license": "MIT",
- "browserslist": "^4.21.3",
+ "dependencies": {
- "caniuse-lite": "^1.0.30001373",
+ "browserslist": "^4.28.2",
- "fraction.js": "^4.2.0",
+ "caniuse-lite": "^1.0.30001787",
- "normalize-range": "^0.1.2",
+ "fraction.js": "^5.3.4",
- "picocolors": "^1.0.0",
+ "picocolors": "^1.1.1",
"postcss-value-parser": "^4.2.0"
@@ -286,20 +276,54 @@
},
+ "node_modules/baseline-browser-mapping": {
+
+ "version": "2.10.29",
+
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz",
+
+ "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==",
+
+ "dev": true,
+
+ "license": "Apache-2.0",
+
+ "bin": {
+
+ "baseline-browser-mapping": "dist/cli.cjs"
+
+ },
+
+ "engines": {
+
+ "node": ">=6.0.0"
+
+ }
+
+ },
+
"node_modules/binary-extensions": {
- "version": "2.2.0",
+ "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">=8"
+ },
+
+ "funding": {
+
+ "url": "https://github.com/sponsors/sindresorhus"
+
}
},
@@ -314,6 +338,8 @@
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"fill-range": "^7.1.1"
@@ -330,11 +356,11 @@
"node_modules/browserslist": {
- "version": "4.21.3",
+ "version": "4.28.2",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
- "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==",
+ "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
"dev": true,
@@ -354,19 +380,31 @@
"url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+
+ {
+
+ "type": "github",
+
+ "url": "https://github.com/sponsors/ai"
+
}
],
+ "license": "MIT",
+
"dependencies": {
- "caniuse-lite": "^1.0.30001370",
+ "baseline-browser-mapping": "^2.10.12",
+
+ "caniuse-lite": "^1.0.30001782",
- "electron-to-chromium": "^1.4.202",
+ "electron-to-chromium": "^1.5.328",
- "node-releases": "^2.0.6",
+ "node-releases": "^2.0.36",
- "update-browserslist-db": "^1.0.5"
+ "update-browserslist-db": "^1.2.3"
},
@@ -386,11 +424,11 @@
"node_modules/caniuse-lite": {
- "version": "1.0.30001378",
+ "version": "1.0.30001792",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz",
- "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==",
+ "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==",
"dev": true,
@@ -410,33 +448,33 @@
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- }
+ },
- ]
+ {
- },
+ "type": "github",
- "node_modules/chokidar": {
+ "url": "https://github.com/sponsors/ai"
- "version": "3.5.3",
+ }
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ ],
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "license": "CC-BY-4.0"
- "dev": true,
+ },
- "funding": [
+ "node_modules/chokidar": {
- {
+ "version": "3.6.0",
- "type": "individual",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "url": "https://paulmillr.com/funding/"
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- }
+ "dev": true,
- ],
+ "license": "MIT",
"dependencies": {
@@ -462,6 +500,12 @@
},
+ "funding": {
+
+ "url": "https://paulmillr.com/funding/"
+
+ },
+
"optionalDependencies": {
"fsevents": "~2.3.2"
@@ -480,6 +524,8 @@
"dev": true,
+ "license": "BlueOak-1.0.0",
+
"engines": {
"node": ">=18"
@@ -490,22 +536,188 @@
"node_modules/cliui": {
- "version": "7.0.4",
+ "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dev": true,
+ "license": "ISC",
+
"dependencies": {
"string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
+ "strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
+ },
+
+ "engines": {
+
+ "node": ">=12"
+
+ }
+
+ },
+
+ "node_modules/cliui/node_modules/ansi-regex": {
+
+ "version": "5.0.1",
+
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "engines": {
+
+ "node": ">=8"
+
+ }
+
+ },
+
+ "node_modules/cliui/node_modules/ansi-styles": {
+
+ "version": "4.3.0",
+
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "dependencies": {
+
+ "color-convert": "^2.0.1"
+
+ },
+
+ "engines": {
+
+ "node": ">=8"
+
+ },
+
+ "funding": {
+
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+
+ }
+
+ },
+
+ "node_modules/cliui/node_modules/emoji-regex": {
+
+ "version": "8.0.0",
+
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+
+ "dev": true,
+
+ "license": "MIT"
+
+ },
+
+ "node_modules/cliui/node_modules/string-width": {
+
+ "version": "4.2.3",
+
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "dependencies": {
+
+ "emoji-regex": "^8.0.0",
+
+ "is-fullwidth-code-point": "^3.0.0",
+
+ "strip-ansi": "^6.0.1"
+
+ },
+
+ "engines": {
+
+ "node": ">=8"
+
+ }
+
+ },
+
+ "node_modules/cliui/node_modules/strip-ansi": {
+
+ "version": "6.0.1",
+
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "dependencies": {
+
+ "ansi-regex": "^5.0.1"
+
+ },
+
+ "engines": {
+
+ "node": ">=8"
+
+ }
+
+ },
+
+ "node_modules/cliui/node_modules/wrap-ansi": {
+
+ "version": "7.0.0",
+
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "dependencies": {
+
+ "ansi-styles": "^4.0.0",
+
+ "string-width": "^4.1.0",
+
+ "strip-ansi": "^6.0.0"
+
+ },
+
+ "engines": {
+
+ "node": ">=10"
+
+ },
+
+ "funding": {
+
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+
}
},
@@ -520,6 +732,8 @@
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"color-name": "~1.1.4"
@@ -542,7 +756,9 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "dev": true,
+
+ "license": "MIT"
},
@@ -556,6 +772,8 @@
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">= 0.6.0"
@@ -574,6 +792,8 @@
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"path-type": "^4.0.0"
@@ -588,40 +808,50 @@
},
- "node_modules/electron-to-chromium": {
+ "node_modules/dompurify": {
- "version": "1.4.224",
+ "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.224.tgz",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.3.tgz",
- "integrity": "sha512-dOujC5Yzj0nOVE23iD5HKqrRSDj2SD7RazpZS/b/WX85MtO6/LzKDF4TlYZTBteB+7fvSg5JpWh0sN7fImNF8w==",
+ "integrity": "sha512-VVwJidIJcp1hpg2OMXML3ZVRPYSZiq4aX7qBh83BSIpOaRDqI+qxhXjjIWnpzkOXhmp0L81lnoME1mnCc9H48A==",
- "dev": true
+ "license": "(MPL-2.0 OR Apache-2.0)",
+
+ "optionalDependencies": {
+
+ "@types/trusted-types": "^2.0.7"
+
+ }
},
- "node_modules/emoji-regex": {
+ "node_modules/electron-to-chromium": {
- "version": "8.0.0",
+ "version": "1.5.354",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.354.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "integrity": "sha512-JaBHwWcfIdmSAfWM5l3uwjGd431j8YEMikZ+K/2nXVuBqJKyZ0f+2h4n4JY5AyNiZmnY9qQr2RU3v9DxDmHMNg==",
- "dev": true
+ "dev": true,
+
+ "license": "ISC"
},
"node_modules/escalade": {
- "version": "3.1.1",
+ "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">=6"
@@ -632,14 +862,16 @@
"node_modules/fast-glob": {
- "version": "3.2.11",
+ "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
@@ -650,7 +882,7 @@
"merge2": "^1.3.0",
- "micromatch": "^4.0.4"
+ "micromatch": "^4.0.8"
},
@@ -664,14 +896,16 @@
"node_modules/fastq": {
- "version": "1.13.0",
+ "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
"dev": true,
+ "license": "ISC",
+
"dependencies": {
"reusify": "^1.0.4"
@@ -690,6 +924,8 @@
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"to-regex-range": "^5.0.1"
@@ -706,14 +942,16 @@
"node_modules/fraction.js": {
- "version": "4.2.0",
+ "version": "5.3.4",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
- "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": "*"
@@ -722,9 +960,9 @@
"funding": {
- "type": "patreon",
+ "type": "github",
- "url": "https://www.patreon.com/infusion"
+ "url": "https://github.com/sponsors/rawify"
}
@@ -732,14 +970,16 @@
"node_modules/fs-extra": {
- "version": "10.1.0",
+ "version": "11.3.5",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==",
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"graceful-fs": "^4.2.0",
@@ -752,7 +992,7 @@
"engines": {
- "node": ">=12"
+ "node": ">=14.14"
}
@@ -760,16 +1000,18 @@
"node_modules/fsevents": {
- "version": "2.3.2",
+ "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
+
"optional": true,
"os": [
@@ -796,6 +1038,8 @@
"dev": true,
+ "license": "ISC",
+
"engines": {
"node": "6.* || 8.* || >= 10.*"
@@ -814,6 +1058,8 @@
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">=12"
@@ -838,6 +1084,8 @@
"dev": true,
+ "license": "ISC",
+
"dependencies": {
"is-glob": "^4.0.1"
@@ -854,21 +1102,23 @@
"node_modules/globby": {
- "version": "13.1.2",
+ "version": "13.2.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz",
- "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==",
+ "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==",
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"dir-glob": "^3.0.1",
- "fast-glob": "^3.2.11",
+ "fast-glob": "^3.3.0",
- "ignore": "^5.2.0",
+ "ignore": "^5.2.4",
"merge2": "^1.4.1",
@@ -890,15 +1140,43 @@
},
+ "node_modules/globby/node_modules/slash": {
+
+ "version": "4.0.0",
+
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "engines": {
+
+ "node": ">=12"
+
+ },
+
+ "funding": {
+
+ "url": "https://github.com/sponsors/sindresorhus"
+
+ }
+
+ },
+
"node_modules/graceful-fs": {
- "version": "4.2.10",
+ "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true
+ "dev": true,
+
+ "license": "ISC"
},
@@ -914,6 +1192,8 @@
"hasInstallScript": true,
+ "license": "MIT",
+
"dependencies": {
"adm-zip": "^0.5.16",
@@ -940,14 +1220,16 @@
"node_modules/ignore": {
- "version": "5.2.0",
+ "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">= 4"
@@ -966,6 +1248,8 @@
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"binary-extensions": "^2.0.0"
@@ -990,6 +1274,8 @@
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">=0.10.0"
@@ -1008,6 +1294,8 @@
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">=8"
@@ -1026,6 +1314,8 @@
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"is-extglob": "^2.1.1"
@@ -1050,6 +1340,8 @@
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">=0.12.0"
@@ -1064,20 +1356,24 @@
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
- "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
+ "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
+
+ "license": "MIT"
},
"node_modules/jsonfile": {
- "version": "6.1.0",
+ "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"universalify": "^2.0.0"
@@ -1094,17 +1390,49 @@
"node_modules/lilconfig": {
- "version": "2.0.6",
+ "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
- "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
"dev": true,
+ "license": "MIT",
+
"engines": {
- "node": ">=10"
+ "node": ">=14"
+
+ },
+
+ "funding": {
+
+ "url": "https://github.com/sponsors/antonk52"
+
+ }
+
+ },
+
+ "node_modules/marked": {
+
+ "version": "15.0.12",
+
+ "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz",
+
+ "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==",
+
+ "license": "MIT",
+
+ "bin": {
+
+ "marked": "bin/marked.js"
+
+ },
+
+ "engines": {
+
+ "node": ">= 18"
}
@@ -1120,6 +1448,8 @@
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">= 8"
@@ -1138,6 +1468,8 @@
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"braces": "^3.0.3",
@@ -1156,14 +1488,16 @@
"node_modules/minipass": {
- "version": "7.1.2",
+ "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
"dev": true,
+ "license": "BlueOak-1.0.0",
+
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -1182,6 +1516,8 @@
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"minipass": "^7.1.2"
@@ -1198,11 +1534,11 @@
"node_modules/nanoid": {
- "version": "3.3.11",
+ "version": "3.3.12",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
- "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
"dev": true,
@@ -1218,6 +1554,8 @@
],
+ "license": "MIT",
+
"bin": {
"nanoid": "bin/nanoid.cjs"
@@ -1234,13 +1572,15 @@
"node_modules/node-releases": {
- "version": "2.0.6",
+ "version": "2.0.44",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz",
- "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+ "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==",
- "dev": true
+ "dev": true,
+
+ "license": "MIT"
},
@@ -1254,23 +1594,7 @@
"dev": true,
- "engines": {
-
- "node": ">=0.10.0"
-
- }
-
- },
-
- "node_modules/normalize-range": {
-
- "version": "0.1.2",
-
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
-
- "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
-
- "dev": true,
+ "license": "MIT",
"engines": {
@@ -1290,6 +1614,8 @@
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">=8"
@@ -1306,20 +1632,24 @@
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "dev": true
+ "dev": true,
+
+ "license": "ISC"
},
"node_modules/picomatch": {
- "version": "2.3.1",
+ "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">=8.6"
@@ -1344,6 +1674,8 @@
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">=0.10.0"
@@ -1354,11 +1686,11 @@
"node_modules/postcss": {
- "version": "8.5.6",
+ "version": "8.5.14",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
- "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
"dev": true,
@@ -1390,6 +1722,8 @@
],
+ "license": "MIT",
+
"dependencies": {
"nanoid": "^3.3.11",
@@ -1410,21 +1744,23 @@
"node_modules/postcss-cli": {
- "version": "10.0.0",
+ "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.0.0.tgz",
+ "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.1.0.tgz",
- "integrity": "sha512-Wjy/00wBBEgQqnSToznxLWDnATznokFGXsHtF/3G8glRZpz5KYlfHcBW/VMJmWAeF2x49zjgy4izjM3/Wx1dKA==",
+ "integrity": "sha512-Zu7PLORkE9YwNdvOeOVKPmWghprOtjFQU3srMUGbdz3pHJiFh7yZ4geiZFMkjMfB0mtTFR3h8RemR62rPkbOPA==",
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"chokidar": "^3.3.0",
"dependency-graph": "^0.11.0",
- "fs-extra": "^10.0.0",
+ "fs-extra": "^11.0.0",
"get-stdin": "^9.0.0",
@@ -1440,7 +1776,7 @@
"read-cache": "^1.0.0",
- "slash": "^4.0.0",
+ "slash": "^5.0.0",
"yargs": "^17.0.0"
@@ -1458,29 +1794,51 @@
},
- "peerDependencies": {
+ "peerDependencies": {
+
+ "postcss": "^8.0.0"
+
+ }
+
+ },
+
+ "node_modules/postcss-load-config": {
+
+ "version": "4.0.2",
+
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+
+ "dev": true,
+
+ "funding": [
+
+ {
+
+ "type": "opencollective",
- "postcss": "^8.0.0"
+ "url": "https://opencollective.com/postcss/"
- }
+ },
- },
+ {
- "node_modules/postcss-load-config": {
+ "type": "github",
- "version": "4.0.1",
+ "url": "https://github.com/sponsors/ai"
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ }
- "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ ],
- "dev": true,
+ "license": "MIT",
"dependencies": {
- "lilconfig": "^2.0.5",
+ "lilconfig": "^3.0.0",
- "yaml": "^2.1.1"
+ "yaml": "^2.3.4"
},
@@ -1490,14 +1848,6 @@
},
- "funding": {
-
- "type": "opencollective",
-
- "url": "https://opencollective.com/postcss/"
-
- },
-
"peerDependencies": {
"postcss": ">=8.0.9",
@@ -1526,14 +1876,36 @@
"node_modules/postcss-reporter": {
- "version": "7.0.5",
+ "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz",
+ "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz",
- "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==",
+ "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==",
"dev": true,
+ "funding": [
+
+ {
+
+ "type": "opencollective",
+
+ "url": "https://opencollective.com/postcss/"
+
+ },
+
+ {
+
+ "type": "github",
+
+ "url": "https://github.com/sponsors/ai"
+
+ }
+
+ ],
+
+ "license": "MIT",
+
"dependencies": {
"picocolors": "^1.0.0",
@@ -1548,14 +1920,6 @@
},
- "funding": {
-
- "type": "opencollective",
-
- "url": "https://opencollective.com/postcss/"
-
- },
-
"peerDependencies": {
"postcss": "^8.1.0"
@@ -1572,7 +1936,9 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true
+ "dev": true,
+
+ "license": "MIT"
},
@@ -1586,6 +1952,8 @@
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">= 0.8"
@@ -1630,7 +1998,9 @@
}
- ]
+ ],
+
+ "license": "MIT"
},
@@ -1644,6 +2014,8 @@
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"pify": "^2.3.0"
@@ -1662,6 +2034,8 @@
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"picomatch": "^2.2.1"
@@ -1686,6 +2060,8 @@
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">=0.10.0"
@@ -1696,14 +2072,16 @@
"node_modules/reusify": {
- "version": "1.0.4",
+ "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
"dev": true,
+ "license": "MIT",
+
"engines": {
"iojs": ">=1.0.0",
@@ -1752,6 +2130,8 @@
],
+ "license": "MIT",
+
"dependencies": {
"queue-microtask": "^1.2.2"
@@ -1762,17 +2142,19 @@
"node_modules/slash": {
- "version": "4.0.0",
+ "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
- "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
"dev": true,
+ "license": "MIT",
+
"engines": {
- "node": ">=12"
+ "node": ">=14.16"
},
@@ -1794,61 +2176,11 @@
"dev": true,
- "engines": {
-
- "node": ">=0.10.0"
-
- }
-
- },
-
- "node_modules/string-width": {
-
- "version": "4.2.3",
-
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-
- "dev": true,
-
- "dependencies": {
-
- "emoji-regex": "^8.0.0",
-
- "is-fullwidth-code-point": "^3.0.0",
-
- "strip-ansi": "^6.0.1"
-
- },
-
- "engines": {
-
- "node": ">=8"
-
- }
-
- },
-
- "node_modules/strip-ansi": {
-
- "version": "6.0.1",
-
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-
- "dev": true,
-
- "dependencies": {
-
- "ansi-regex": "^5.0.1"
-
- },
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">=8"
+ "node": ">=0.10.0"
}
@@ -1866,14 +2198,16 @@
"node_modules/tar": {
- "version": "7.5.7",
+ "version": "7.5.15",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz",
- "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==",
+ "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==",
"dev": true,
+ "license": "BlueOak-1.0.0",
+
"dependencies": {
"@isaacs/fs-minipass": "^4.0.0",
@@ -1898,13 +2232,15 @@
"node_modules/thenby": {
- "version": "1.3.4",
+ "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz",
+ "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.4.1.tgz",
- "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==",
+ "integrity": "sha512-D5a/bO0KdalOE3q8MlrRmSxjbKZHT3MQmXkJP+r97Vw8MMwOZKOwUSEyTtK7eSMj2y0kyAjpYMRMZmmLw1FtNQ==",
- "dev": true
+ "dev": true,
+
+ "license": "Apache-2.0"
},
@@ -1918,6 +2254,8 @@
"dev": true,
+ "license": "MIT",
+
"dependencies": {
"is-number": "^7.0.0"
@@ -1934,14 +2272,16 @@
"node_modules/universalify": {
- "version": "2.0.0",
+ "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
+ "license": "MIT",
+
"engines": {
"node": ">= 10.0.0"
@@ -1952,11 +2292,11 @@
"node_modules/update-browserslist-db": {
- "version": "1.0.5",
+ "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
- "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
"dev": true,
@@ -1976,61 +2316,37 @@
"url": "https://tidelift.com/funding/github/npm/browserslist"
- }
-
- ],
-
- "dependencies": {
-
- "escalade": "^3.1.1",
-
- "picocolors": "^1.0.0"
-
- },
-
- "bin": {
-
- "browserslist-lint": "cli.js"
-
- },
-
- "peerDependencies": {
-
- "browserslist": ">= 4.21.0"
-
- }
+ },
- },
+ {
- "node_modules/wrap-ansi": {
+ "type": "github",
- "version": "7.0.0",
+ "url": "https://github.com/sponsors/ai"
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ }
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ ],
- "dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-styles": "^4.0.0",
-
- "string-width": "^4.1.0",
+ "escalade": "^3.2.0",
- "strip-ansi": "^6.0.0"
+ "picocolors": "^1.1.1"
},
- "engines": {
+ "bin": {
- "node": ">=10"
+ "update-browserslist-db": "cli.js"
},
- "funding": {
+ "peerDependencies": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ "browserslist": ">= 4.21.0"
}
@@ -2046,6 +2362,8 @@
"dev": true,
+ "license": "ISC",
+
"engines": {
"node": ">=10"
@@ -2064,6 +2382,8 @@
"dev": true,
+ "license": "BlueOak-1.0.0",
+
"engines": {
"node": ">=18"
@@ -2074,14 +2394,16 @@
"node_modules/yaml": {
- "version": "2.8.2",
+ "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
- "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
"dev": true,
+ "license": "ISC",
+
"bin": {
"yaml": "bin.mjs"
@@ -2104,17 +2426,19 @@
"node_modules/yargs": {
- "version": "17.5.1",
+ "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
+ "license": "MIT",
+
"dependencies": {
- "cliui": "^7.0.2",
+ "cliui": "^8.0.1",
"escalade": "^3.1.1",
@@ -2126,7 +2450,7 @@
"y18n": "^5.0.5",
- "yargs-parser": "^21.0.0"
+ "yargs-parser": "^21.1.1"
},
@@ -2140,17 +2464,109 @@
"node_modules/yargs-parser": {
- "version": "21.1.1",
+ "version": "21.1.1",
+
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+
+ "dev": true,
+
+ "license": "ISC",
+
+ "engines": {
+
+ "node": ">=12"
+
+ }
+
+ },
+
+ "node_modules/yargs/node_modules/ansi-regex": {
+
+ "version": "5.0.1",
+
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "engines": {
+
+ "node": ">=8"
+
+ }
+
+ },
+
+ "node_modules/yargs/node_modules/emoji-regex": {
+
+ "version": "8.0.0",
+
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+
+ "dev": true,
+
+ "license": "MIT"
+
+ },
+
+ "node_modules/yargs/node_modules/string-width": {
+
+ "version": "4.2.3",
+
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+
+ "dev": true,
+
+ "license": "MIT",
+
+ "dependencies": {
+
+ "emoji-regex": "^8.0.0",
+
+ "is-fullwidth-code-point": "^3.0.0",
+
+ "strip-ansi": "^6.0.1"
+
+ },
+
+ "engines": {
+
+ "node": ">=8"
+
+ }
+
+ },
+
+ "node_modules/yargs/node_modules/strip-ansi": {
+
+ "version": "6.0.1",
+
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+
+ "dev": true,
+
+ "license": "MIT",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "dependencies": {
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "ansi-regex": "^5.0.1"
- "dev": true,
+ },
"engines": {
- "node": ">=12"
+ "node": ">=8"
}
@@ -2230,55 +2646,37 @@
},
- "adm-zip": {
+ "@types/trusted-types": {
- "version": "0.5.16",
+ "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
- "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
- "dev": true
+ "optional": true
},
- "ansi-regex": {
+ "adm-zip": {
- "version": "5.0.1",
+ "version": "0.5.17",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==",
"dev": true
},
- "ansi-styles": {
-
- "version": "4.3.0",
-
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-
- "dev": true,
-
- "requires": {
-
- "color-convert": "^2.0.1"
-
- }
-
- },
-
"anymatch": {
- "version": "3.1.2",
+ "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
@@ -2294,25 +2692,23 @@
"autoprefixer": {
- "version": "10.4.8",
+ "version": "10.5.0",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz",
- "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==",
+ "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==",
"dev": true,
"requires": {
- "browserslist": "^4.21.3",
-
- "caniuse-lite": "^1.0.30001373",
+ "browserslist": "^4.28.2",
- "fraction.js": "^4.2.0",
+ "caniuse-lite": "^1.0.30001787",
- "normalize-range": "^0.1.2",
+ "fraction.js": "^5.3.4",
- "picocolors": "^1.0.0",
+ "picocolors": "^1.1.1",
"postcss-value-parser": "^4.2.0"
@@ -2320,13 +2716,25 @@
},
+ "baseline-browser-mapping": {
+
+ "version": "2.10.29",
+
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz",
+
+ "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==",
+
+ "dev": true
+
+ },
+
"binary-extensions": {
- "version": "2.2.0",
+ "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"dev": true
@@ -2352,23 +2760,25 @@
"browserslist": {
- "version": "4.21.3",
+ "version": "4.28.2",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
- "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==",
+ "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001370",
+ "baseline-browser-mapping": "^2.10.12",
+
+ "caniuse-lite": "^1.0.30001782",
- "electron-to-chromium": "^1.4.202",
+ "electron-to-chromium": "^1.5.328",
- "node-releases": "^2.0.6",
+ "node-releases": "^2.0.36",
- "update-browserslist-db": "^1.0.5"
+ "update-browserslist-db": "^1.2.3"
}
@@ -2376,11 +2786,11 @@
"caniuse-lite": {
- "version": "1.0.30001378",
+ "version": "1.0.30001792",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz",
- "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==",
+ "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==",
"dev": true
@@ -2388,11 +2798,11 @@
"chokidar": {
- "version": "3.5.3",
+ "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
@@ -2432,11 +2842,11 @@
"cliui": {
- "version": "7.0.4",
+ "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dev": true,
@@ -2444,10 +2854,118 @@
"string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
+ "strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
+ },
+
+ "dependencies": {
+
+ "ansi-regex": {
+
+ "version": "5.0.1",
+
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+
+ "dev": true
+
+ },
+
+ "ansi-styles": {
+
+ "version": "4.3.0",
+
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+
+ "dev": true,
+
+ "requires": {
+
+ "color-convert": "^2.0.1"
+
+ }
+
+ },
+
+ "emoji-regex": {
+
+ "version": "8.0.0",
+
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+
+ "dev": true
+
+ },
+
+ "string-width": {
+
+ "version": "4.2.3",
+
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+
+ "dev": true,
+
+ "requires": {
+
+ "emoji-regex": "^8.0.0",
+
+ "is-fullwidth-code-point": "^3.0.0",
+
+ "strip-ansi": "^6.0.1"
+
+ }
+
+ },
+
+ "strip-ansi": {
+
+ "version": "6.0.1",
+
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+
+ "dev": true,
+
+ "requires": {
+
+ "ansi-regex": "^5.0.1"
+
+ }
+
+ },
+
+ "wrap-ansi": {
+
+ "version": "7.0.0",
+
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+
+ "dev": true,
+
+ "requires": {
+
+ "ansi-styles": "^4.0.0",
+
+ "string-width": "^4.1.0",
+
+ "strip-ansi": "^6.0.0"
+
+ }
+
+ }
+
}
},
@@ -2512,25 +3030,29 @@
},
- "electron-to-chromium": {
+ "dompurify": {
- "version": "1.4.224",
+ "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.224.tgz",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.3.tgz",
- "integrity": "sha512-dOujC5Yzj0nOVE23iD5HKqrRSDj2SD7RazpZS/b/WX85MtO6/LzKDF4TlYZTBteB+7fvSg5JpWh0sN7fImNF8w==",
+ "integrity": "sha512-VVwJidIJcp1hpg2OMXML3ZVRPYSZiq4aX7qBh83BSIpOaRDqI+qxhXjjIWnpzkOXhmp0L81lnoME1mnCc9H48A==",
- "dev": true
+ "requires": {
+
+ "@types/trusted-types": "^2.0.7"
+
+ }
},
- "emoji-regex": {
+ "electron-to-chromium": {
- "version": "8.0.0",
+ "version": "1.5.354",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.354.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "integrity": "sha512-JaBHwWcfIdmSAfWM5l3uwjGd431j8YEMikZ+K/2nXVuBqJKyZ0f+2h4n4JY5AyNiZmnY9qQr2RU3v9DxDmHMNg==",
"dev": true
@@ -2538,11 +3060,11 @@
"escalade": {
- "version": "3.1.1",
+ "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true
@@ -2550,11 +3072,11 @@
"fast-glob": {
- "version": "3.2.11",
+ "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
@@ -2568,7 +3090,7 @@
"merge2": "^1.3.0",
- "micromatch": "^4.0.4"
+ "micromatch": "^4.0.8"
}
@@ -2576,11 +3098,11 @@
"fastq": {
- "version": "1.13.0",
+ "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
"dev": true,
@@ -2612,11 +3134,11 @@
"fraction.js": {
- "version": "4.2.0",
+ "version": "5.3.4",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
- "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
"dev": true
@@ -2624,11 +3146,11 @@
"fs-extra": {
- "version": "10.1.0",
+ "version": "11.3.5",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==",
"dev": true,
@@ -2646,11 +3168,11 @@
"fsevents": {
- "version": "2.3.2",
+ "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
@@ -2702,11 +3224,11 @@
"globby": {
- "version": "13.1.2",
+ "version": "13.2.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz",
- "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==",
+ "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==",
"dev": true,
@@ -2714,25 +3236,41 @@
"dir-glob": "^3.0.1",
- "fast-glob": "^3.2.11",
+ "fast-glob": "^3.3.0",
- "ignore": "^5.2.0",
+ "ignore": "^5.2.4",
"merge2": "^1.4.1",
"slash": "^4.0.0"
+ },
+
+ "dependencies": {
+
+ "slash": {
+
+ "version": "4.0.0",
+
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+
+ "dev": true
+
+ }
+
}
},
"graceful-fs": {
- "version": "4.2.10",
+ "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true
@@ -2760,11 +3298,11 @@
"ignore": {
- "version": "5.2.0",
+ "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true
@@ -2854,11 +3392,11 @@
"jsonfile": {
- "version": "6.1.0",
+ "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
"dev": true,
@@ -2874,16 +3412,26 @@
"lilconfig": {
- "version": "2.0.6",
+ "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
- "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
"dev": true
},
+ "marked": {
+
+ "version": "15.0.12",
+
+ "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz",
+
+ "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA=="
+
+ },
+
"merge2": {
"version": "1.4.1",
@@ -2918,11 +3466,11 @@
"minipass": {
- "version": "7.1.2",
+ "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
"dev": true
@@ -2948,11 +3496,11 @@
"nanoid": {
- "version": "3.3.11",
+ "version": "3.3.12",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
- "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
"dev": true
@@ -2960,11 +3508,11 @@
"node-releases": {
- "version": "2.0.6",
+ "version": "2.0.44",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz",
- "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+ "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==",
"dev": true
@@ -2982,18 +3530,6 @@
},
- "normalize-range": {
-
- "version": "0.1.2",
-
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
-
- "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
-
- "dev": true
-
- },
-
"path-type": {
"version": "4.0.0",
@@ -3020,11 +3556,11 @@
"picomatch": {
- "version": "2.3.1",
+ "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true
@@ -3044,11 +3580,11 @@
"postcss": {
- "version": "8.5.6",
+ "version": "8.5.14",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
- "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
"dev": true,
@@ -3066,11 +3602,11 @@
"postcss-cli": {
- "version": "10.0.0",
+ "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.0.0.tgz",
+ "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.1.0.tgz",
- "integrity": "sha512-Wjy/00wBBEgQqnSToznxLWDnATznokFGXsHtF/3G8glRZpz5KYlfHcBW/VMJmWAeF2x49zjgy4izjM3/Wx1dKA==",
+ "integrity": "sha512-Zu7PLORkE9YwNdvOeOVKPmWghprOtjFQU3srMUGbdz3pHJiFh7yZ4geiZFMkjMfB0mtTFR3h8RemR62rPkbOPA==",
"dev": true,
@@ -3080,7 +3616,7 @@
"dependency-graph": "^0.11.0",
- "fs-extra": "^10.0.0",
+ "fs-extra": "^11.0.0",
"get-stdin": "^9.0.0",
@@ -3096,7 +3632,7 @@
"read-cache": "^1.0.0",
- "slash": "^4.0.0",
+ "slash": "^5.0.0",
"yargs": "^17.0.0"
@@ -3106,19 +3642,19 @@
"postcss-load-config": {
- "version": "4.0.1",
+ "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
- "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
"dev": true,
"requires": {
- "lilconfig": "^2.0.5",
+ "lilconfig": "^3.0.0",
- "yaml": "^2.1.1"
+ "yaml": "^2.3.4"
}
@@ -3126,11 +3662,11 @@
"postcss-reporter": {
- "version": "7.0.5",
+ "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz",
+ "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz",
- "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==",
+ "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==",
"dev": true,
@@ -3230,11 +3766,11 @@
"reusify": {
- "version": "1.0.4",
+ "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
"dev": true
@@ -3260,11 +3796,11 @@
"slash": {
- "version": "4.0.0",
+ "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
- "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
"dev": true
@@ -3282,46 +3818,6 @@
},
- "string-width": {
-
- "version": "4.2.3",
-
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-
- "dev": true,
-
- "requires": {
-
- "emoji-regex": "^8.0.0",
-
- "is-fullwidth-code-point": "^3.0.0",
-
- "strip-ansi": "^6.0.1"
-
- }
-
- },
-
- "strip-ansi": {
-
- "version": "6.0.1",
-
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-
- "dev": true,
-
- "requires": {
-
- "ansi-regex": "^5.0.1"
-
- }
-
- },
-
"tabpanel": {
"version": "0.2.0",
@@ -3334,11 +3830,11 @@
"tar": {
- "version": "7.5.7",
+ "version": "7.5.15",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz",
- "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==",
+ "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==",
"dev": true,
@@ -3360,11 +3856,11 @@
"thenby": {
- "version": "1.3.4",
+ "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz",
+ "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.4.1.tgz",
- "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==",
+ "integrity": "sha512-D5a/bO0KdalOE3q8MlrRmSxjbKZHT3MQmXkJP+r97Vw8MMwOZKOwUSEyTtK7eSMj2y0kyAjpYMRMZmmLw1FtNQ==",
"dev": true
@@ -3390,11 +3886,11 @@
"universalify": {
- "version": "2.0.0",
+ "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true
@@ -3402,41 +3898,19 @@
"update-browserslist-db": {
- "version": "1.0.5",
-
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz",
-
- "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==",
-
- "dev": true,
-
- "requires": {
-
- "escalade": "^3.1.1",
-
- "picocolors": "^1.0.0"
-
- }
-
- },
-
- "wrap-ansi": {
-
- "version": "7.0.0",
+ "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
"dev": true,
"requires": {
- "ansi-styles": "^4.0.0",
-
- "string-width": "^4.1.0",
+ "escalade": "^3.2.0",
- "strip-ansi": "^6.0.0"
+ "picocolors": "^1.1.1"
}
@@ -3468,11 +3942,11 @@
"yaml": {
- "version": "2.8.2",
+ "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
- "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
"dev": true
@@ -3480,17 +3954,17 @@
"yargs": {
- "version": "17.5.1",
+ "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
"requires": {
- "cliui": "^7.0.2",
+ "cliui": "^8.0.1",
"escalade": "^3.1.1",
@@ -3502,7 +3976,75 @@
"y18n": "^5.0.5",
- "yargs-parser": "^21.0.0"
+ "yargs-parser": "^21.1.1"
+
+ },
+
+ "dependencies": {
+
+ "ansi-regex": {
+
+ "version": "5.0.1",
+
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+
+ "dev": true
+
+ },
+
+ "emoji-regex": {
+
+ "version": "8.0.0",
+
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+
+ "dev": true
+
+ },
+
+ "string-width": {
+
+ "version": "4.2.3",
+
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+
+ "dev": true,
+
+ "requires": {
+
+ "emoji-regex": "^8.0.0",
+
+ "is-fullwidth-code-point": "^3.0.0",
+
+ "strip-ansi": "^6.0.1"
+
+ }
+
+ },
+
+ "strip-ansi": {
+
+ "version": "6.0.1",
+
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+
+ "dev": true,
+
+ "requires": {
+
+ "ansi-regex": "^5.0.1"
+
+ }
+
+ }
}
diff --git a/package.json b/package.json
index 7acc342b..cd73ea02 100644
--- a/package.json
+++ b/package.json
@@ -14,8 +14,12 @@
"dependencies": {
+ "dompurify": "^3.3.1",
+
"jquery": "^3.7.1",
+ "marked": "^15.0.12",
+
"tabpanel": "^0.2.0"
}
diff --git a/tests/test_hugo_build.py b/tests/test_hugo_build.py
index 55c22fee..2a98fd51 100644
--- a/tests/test_hugo_build.py
+++ b/tests/test_hugo_build.py
@@ -229,6 +229,141 @@ def test_no_sidebar_truncation_warning(self) -> None:
), "Sidebar entries were truncated — bibliography entries may be leaking into navigation"
+class TestSearchModeToggle:
+ """The Standard / AI-assisted search controls must reach the built site.
+
+ Regression test: ``layouts/_partials/search-input.html`` — the Docsy
+ override that renders the pre-search "Standard [switch] AI" picker below
+ the search box — was left untracked when the toggle feature was
+ committed. Its JavaScript (``assets/js/search.js``), styles
+ (``assets/scss/_styles_project.scss``) and results-page controls
+ (``layouts/search.html``) were all committed, so local ``hugo server``
+ runs showed the picker while every build from a clean checkout fell back
+ to Docsy's ``search-input`` partial, which has none. The control was
+ thus missing from CI builds and the deployed site with its handlers and
+ styles still shipping. These tests assert on rendered markup, because
+ the JavaScript and CSS are inert without it.
+ """
+
+ @pytest.fixture(autouse=True)
+ def dual_mode(self, production_build):
+ self.build_result = production_build
+
+ params_file = REPO_ROOT / "config" / "_default" / "params.yaml"
+ if not params_file.exists():
+ pytest.skip("config/_default/params.yaml not found")
+ with open(params_file) as f:
+ params = yaml.safe_load(f) or {}
+
+ # Both backends must be configured for either control to render.
+ if not (params.get("gcs_engine_id") and params.get("vertex_search_url")):
+ pytest.skip(
+ "dual search mode not configured — both gcs_engine_id and "
+ "vertex_search_url are required"
+ )
+
+ index = PROD_PUBLIC / "index.html"
+ search = PROD_PUBLIC / "search" / "index.html"
+ if not (index.exists() and search.exists()):
+ pytest.skip("index.html or search/index.html not built")
+
+ self.index_html = index.read_text(encoding="utf-8", errors="ignore")
+ self.search_html = search.read_text(encoding="utf-8", errors="ignore")
+
+ def test_presearch_picker_rendered(self) -> None:
+ """The "Standard [switch] AI" picker must render under the search box.
+
+ Its presence proves the local ``search-input.html`` override is part
+ of the repository; without it Hugo silently falls back to Docsy's
+ version and the picker disappears.
+ """
+ assert 'class="td-search-mode-switch"' in self.index_html, (
+ "Pre-search mode picker missing from index.html — "
+ "layouts/_partials/search-input.html is not being used"
+ )
+ for selector in ('data-search-mode="standard"', 'data-search-mode="ai"'):
+ assert selector in self.index_html, (
+ f"Picker label {selector} missing from index.html"
+ )
+ assert 'class="form-check-input td-search-mode"' in self.index_html, (
+ "Picker switch input missing from index.html"
+ )
+
+ def test_picker_script_shipped(self) -> None:
+ """A bundled script must reference the picker selectors, so the
+ control is wired to localStorage and the ``?mode=ai`` redirect."""
+ js_dir = PROD_PUBLIC / "js"
+ if not js_dir.is_dir():
+ pytest.skip("public/js not built")
+ wired = any(
+ "td-search-mode-switch" in path.read_text(encoding="utf-8", errors="ignore")
+ for path in js_dir.rglob("*.js")
+ )
+ assert wired, (
+ "No bundled script references td-search-mode-switch — "
+ "assets/js/search.js was not built into the site"
+ )
+
+ def test_picker_defaults_to_standard(self) -> None:
+ """Both controls must be server-rendered in the Standard position.
+
+ The user's selection is persisted in localStorage, so the markup is
+ the *initial* state a first-time visitor gets before any script runs;
+ assets/js/search.js only moves the pickers off Standard once a
+ selection has been stored. A pre-checked switch, an active "AI"
+ label, or a checked AI radio in the rendered markup would hand every
+ new visitor a non-default mode.
+ """
+ assert (
+ 'class="td-search-mode-label is-active" data-search-mode="standard"'
+ in self.index_html
+ ), "Standard is not the active picker label on index.html"
+ assert 'class="td-search-mode-label" data-search-mode="ai"' in self.index_html, (
+ "AI picker label is not in its inactive state on index.html"
+ )
+ switches = re.findall(r" ]*td-search-mode[^>]*>", self.index_html)
+ assert switches, "picker switch input not found on index.html"
+ checked = [s for s in switches if re.search(r"\bchecked\b", s)]
+ assert not checked, (
+ "picker switch renders checked; Standard must be the initial default:\n"
+ + "\n".join(checked)
+ )
+
+ # The results-page radios must agree: Standard selected, AI not.
+ radios = re.findall(r' ]*id="search-mode-[^"]*"[^>]*>', self.search_html)
+ assert len(radios) == 2, (
+ f"expected 2 mode radios on search/index.html, found {len(radios)}"
+ )
+ assert not any(
+ re.search(r'id="search-mode-ai"[^>]*\bchecked\b', r) for r in radios
+ ), "AI mode radio renders checked; Standard must be the initial default"
+
+ def test_results_page_toggle_rendered(self) -> None:
+ """The results page must render both mode radios and the container
+ that assets/js/vertex-search.js binds to before doing anything."""
+ for fragment in (
+ 'id="search-mode-standard"',
+ 'id="search-mode-ai"',
+ 'id="vertex-search-container"',
+ ):
+ assert fragment in self.search_html, (
+ f"{fragment} missing from search/index.html"
+ )
+
+ def test_results_page_toggle_has_one_radiogroup(self) -> None:
+ """The mode radios must sit in a single ``role="radiogroup"``.
+
+ The toggle was originally wrapped in a radiogroup nested inside a
+ second one, which exposes the radios to assistive technology as a
+ group within a group.
+ """
+ groups = self.search_html.count('role="radiogroup"')
+ assert groups == 1, (
+ f"Expected exactly 1 role=\"radiogroup\" on search/index.html, "
+ f"found {groups} — the mode toggle radiogroups are nested"
+ )
+
+
class TestInternalLinks:
"""All internal href links in the built HTML must resolve to existing pages."""