diff --git a/.eleventy.js b/.eleventy.js index 3044b296eb..8a355bed20 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -2,7 +2,27 @@ const slugify = require("@sindresorhus/slugify"); const markdownIt = require("markdown-it"); const fs = require("fs"); const matter = require("gray-matter"); +// Obsidian writes [[Page\|Alias]] in frontmatter, but \| is an invalid YAML +// escape sequence. This custom engine strips \| before parsing. Shared between +// Eleventy's own frontmatter parser and the manual matter() call in +// getAnchorAttributes so that wikilink resolution can read the permalink. +const jsYamlForMatter = require(require.resolve("js-yaml", { paths: [require.resolve("gray-matter")] })); +const matterOptions = { + engines: { + yaml: { + parse: (str) => jsYamlForMatter.load(str.replace(/\\\|/g, "|")), + stringify: (obj) => jsYamlForMatter.dump(obj), + }, + }, +}; const faviconsPlugin = require("eleventy-plugin-gen-favicons"); +const normalizeFavicon = require("./src/site/normalize-favicon.js"); +const { convertMdHrefs } = require("./src/helpers/linkUtils"); +const nodePath = require("path"); + +const FAVICON_SOURCE = "./src/site/favicon.svg"; +const FAVICON_NORMALIZED = "./.cache/favicon.normalized.svg"; +normalizeFavicon(FAVICON_SOURCE, FAVICON_NORMALIZED); const tocPlugin = require("eleventy-plugin-nesting-toc"); const { parse } = require("node-html-parser"); const htmlMinifier = require("html-minifier-terser"); @@ -13,9 +33,26 @@ const { userMarkdownSetup, userEleventySetup, } = require("./src/helpers/userSetup"); +const { basesPlugin } = require("./src/helpers/basesPlugin"); const Image = require("@11ty/eleventy-img"); -function transformImage(src, cls, alt, sizes, widths = ["500", "700", "auto"]) { +const { isDecodableImage } = require("./src/helpers/imageFormat.js"); + +// Build containers have few CPUs and little memory; the default queue +// concurrency of 10 holds ~10 decoded images in memory at once without +// finishing any faster. Sharp already parallelizes within each job. +Image.concurrency = 2; + +// Image generation is started fire-and-forget during transforms (the markup +// only needs statsSync), but every pending job is awaited in the +// eleventy.after hook below so the build doesn't linger — or get killed — +// doing invisible work after Eleventy reports completion. +const pendingImageJobs = []; + +// Note: fillPictureSourceSets only references the first two widths; the +// full-size original is served via the fallback, so a full +// resolution "auto" rendition would never be referenced by the markup. +function transformImage(src, cls, alt, sizes, widths = ["500", "700"]) { let options = { widths: widths, formats: ["webp", "jpeg"], @@ -23,14 +60,19 @@ function transformImage(src, cls, alt, sizes, widths = ["500", "700", "auto"]) { urlPath: "/img/optimized", }; - // generate images, while this is async we don’t wait - Image(src, options); + // A rejection here (e.g. a corrupt file) must not become an unhandled + // rejection, which would fail the whole build. + pendingImageJobs.push( + Image(src, options).catch((err) => { + console.warn(`[image] Skipping optimization of ${src}: ${err.message}`); + }) + ); let metadata = Image.statsSync(src, options); return metadata; } function getAnchorLink(filePath, linkTitle) { - const {attributes, innerHTML} = getAnchorAttributes(filePath, linkTitle); + const { attributes, innerHTML } = getAnchorAttributes(filePath, linkTitle); return ` `${key}="${attributes[key]}"`).join(" ")}>${innerHTML}`; } @@ -38,22 +80,25 @@ function getAnchorAttributes(filePath, linkTitle) { let fileName = filePath.replaceAll("&", "&"); let header = ""; let headerLinkPath = ""; - if (filePath.includes("#")) { - [fileName, header] = filePath.split("#"); + if (fileName.includes("#")) { + [fileName, header] = fileName.split("#"); headerLinkPath = `#${headerToId(header)}`; } let noteIcon = process.env.NOTE_ICON_DEFAULT; const title = linkTitle ? linkTitle : fileName; - let permalink = `/notes/${slugify(filePath)}`; + let permalink = `/notes/${slugify(fileName)}`; let deadLink = false; try { const startPath = "./src/site/notes/"; - const fullPath = fileName.endsWith(".md") - ? `${startPath}${fileName}` - : `${startPath}${fileName}.md`; + let fullPath; + if (fileName.endsWith(".md") || fileName.endsWith(".canvas")) { + fullPath = `${startPath}${fileName}`; + } else { + fullPath = `${startPath}${fileName}.md`; + } const file = fs.readFileSync(fullPath, "utf8"); - const frontMatter = matter(file); + const frontMatter = matter(file, matterOptions); if (frontMatter.data.permalink) { permalink = frontMatter.data.permalink; } @@ -93,10 +138,15 @@ function getAnchorAttributes(filePath, linkTitle) { const tagRegex = /(^|\s|\>)(#[^\s!@#$%^&*()=+\.,\[{\]};:'"?><]+)(?!([^<]*>))/g; -module.exports = function (eleventyConfig) { +const markdownFileTypeRegex = /\.(md|markdown)$/i; +const isMarkdownPage = (inputPath) => inputPath && inputPath.match(markdownFileTypeRegex); + +module.exports = function(eleventyConfig) { eleventyConfig.setLiquidOptions({ dynamicPartials: true, }); + + eleventyConfig.setFrontMatterParsingOptions(matterOptions); let markdownLib = markdownIt({ breaks: true, html: true, @@ -107,8 +157,8 @@ module.exports = function (eleventyConfig) { }) .use(require("markdown-it-mark")) .use(require("markdown-it-footnote")) - .use(function (md) { - md.renderer.rules.hashtag_open = function (tokens, idx) { + .use(function(md) { + md.renderer.rules.hashtag_open = function(tokens, idx) { return ''; }; }) @@ -120,6 +170,22 @@ module.exports = function (eleventyConfig) { skipHtmlTags: { "[-]": ["pre"] }, }, }) + .use(function(md) { + // mathjax-full 3.2.2 throws on characters outside its operator + // dictionary (e.g. "€") — a stray $...€...$ span in prose would + // otherwise abort the entire build. Fall back to the raw text. + for (const rule of ["math_inline", "math_block"]) { + const original = md.renderer.rules[rule]; + if (!original) continue; + md.renderer.rules[rule] = function(tokens, idx, options, env, self) { + try { + return original(tokens, idx, options, env, self); + } catch (e) { + return md.utils.escapeHtml(tokens[idx].content); + } + }; + } + }) .use(require("markdown-it-attrs")) .use(require("markdown-it-task-checkbox"), { disabled: true, @@ -134,11 +200,12 @@ module.exports = function (eleventyConfig) { closeMarker: "```", }) .use(namedHeadingsFilter) - .use(function (md) { + .use(basesPlugin) + .use(function(md) { //https://github.com/DCsunset/markdown-it-mermaid-plugin const origFenceRule = md.renderer.rules.fence || - function (tokens, idx, options, env, self) { + function(tokens, idx, options, env, self) { return self.renderToken(tokens, idx, options, env, self); }; md.renderer.rules.fence = (tokens, idx, options, env, slf) => { @@ -151,6 +218,26 @@ module.exports = function (eleventyConfig) { const code = token.content.trim(); return `
${md.render(code)}
`; } + if (token.info === "gist") { + const code = token.content.trim(); + // Support multiple gist references, one per line + const gistLines = code.split('\n').filter(line => line.trim()); + + const scripts = gistLines.map(line => { + line = line.trim(); + // Parse format: [username/]gist-id[#filename] + const parts = line.split('#'); + const gistPath = parts[0]; + const filename = parts[1] || ''; + + // Build the GitHub Gist embed URL + const gistUrl = `https://gist.github.com/${gistPath}.js`; + const scriptUrl = filename ? `${gistUrl}?file=${encodeURIComponent(filename)}` : gistUrl; + + return ``; + }); + return scripts.join('\n'); + } if (token.info.startsWith("ad-")) { const code = token.content.trim(); const parts = code.split("\n") @@ -209,7 +296,7 @@ module.exports = function (eleventyConfig) { const defaultImageRule = md.renderer.rules.image || - function (tokens, idx, options, env, self) { + function(tokens, idx, options, env, self) { return self.renderToken(tokens, idx, options, env, self); }; md.renderer.rules.image = (tokens, idx, options, env, self) => { @@ -244,23 +331,59 @@ module.exports = function (eleventyConfig) { const defaultLinkRule = md.renderer.rules.link_open || - function (tokens, idx, options, env, self) { + function(tokens, idx, options, env, self) { return self.renderToken(tokens, idx, options, env, self); }; - md.renderer.rules.link_open = function (tokens, idx, options, env, self) { - const aIndex = tokens[idx].attrIndex("target"); - const classIndex = tokens[idx].attrIndex("class"); - - if (aIndex < 0) { - tokens[idx].attrPush(["target", "_blank"]); - } else { - tokens[idx].attrs[aIndex][1] = "_blank"; + function isExternalHref(href) { + if (!href) return false; + const trimmed = href.trim(); + if ( + trimmed.startsWith("/") || + trimmed.startsWith("#") || + trimmed.startsWith("?") || + trimmed.startsWith("./") || + trimmed.startsWith("../") + ) { + return false; } + // Any explicit scheme (http, https, mailto, etc) is treated as external. + return /^[a-z][a-z0-9+.-]*:/i.test(trimmed); + } + + md.renderer.rules.link_open = function(tokens, idx, options, env, self) { + const hrefIndex = tokens[idx].attrIndex("href"); + const href = + hrefIndex >= 0 && tokens[idx].attrs && tokens[idx].attrs[hrefIndex] + ? tokens[idx].attrs[hrefIndex][1] + : ""; + const isExternal = isExternalHref(href); + + if (isExternal) { + const aIndex = tokens[idx].attrIndex("target"); + const classIndex = tokens[idx].attrIndex("class"); - if (classIndex < 0) { - tokens[idx].attrPush(["class", "external-link"]); + if (aIndex < 0) { + tokens[idx].attrPush(["target", "_blank"]); + } else { + tokens[idx].attrs[aIndex][1] = "_blank"; + } + + if (classIndex < 0) { + tokens[idx].attrPush(["class", "external-link"]); + } else if ( + !tokens[idx].attrs[classIndex][1].includes("external-link") + ) { + tokens[idx].attrs[classIndex][1] += " external-link"; + } } else { - tokens[idx].attrs[classIndex][1] = "external-link"; + const classIndex = tokens[idx].attrIndex("class"); + if (classIndex < 0) { + tokens[idx].attrPush(["class", "internal-link"]); + } else if ( + !tokens[idx].attrs[classIndex][1].includes("internal-link") + ) { + tokens[idx].attrs[classIndex][1] += " internal-link"; + } } return defaultLinkRule(tokens, idx, options, env, self); @@ -270,14 +393,14 @@ module.exports = function (eleventyConfig) { eleventyConfig.setLibrary("md", markdownLib); - eleventyConfig.addFilter("isoDate", function (date) { + eleventyConfig.addFilter("isoDate", function(date) { return date && date.toISOString(); }); - eleventyConfig.addFilter("link", function (str) { + eleventyConfig.addFilter("link", function(str) { return ( str && - str.replace(/\[\[(.*?\|.*?)\]\]/g, function (match, p1) { + str.replace(/\[\[(.*?\|.*?)\]\]/g, function(match, p1) { //Check if it is an embedded excalidraw drawing or mathjax javascript if (p1.indexOf("],[") > -1 || p1.indexOf('"$"') > -1) { return match; @@ -289,16 +412,57 @@ module.exports = function (eleventyConfig) { ); }); - eleventyConfig.addFilter("taggify", function (str) { + // Resolve markdown-style relative links to .md files (e.g. [X](../a/b.md)) + // to their real permalinks. Obsidian resolves these in-app, but they reach + // the rendered HTML untouched, where trailing-slash page URLs make the + // browser resolve them one directory too deep. + // pageInputPath overrides this.page for contexts like the feed, where the + // rendered content belongs to a looped-over note rather than the current page. + eleventyConfig.addFilter("resolveMdLinks", function(str, pageInputPath) { + const inputPath = pageInputPath || (this.page && this.page.inputPath); + if (!str || !inputPath) { + return str; + } + const notesRoot = "src/site/notes/"; + const normalizedInput = inputPath.replace(/^\.\//, ""); + const rootIndex = normalizedInput.indexOf(notesRoot); + if (rootIndex === -1) { + return str; + } + const vaultFilePath = normalizedInput.slice(rootIndex + notesRoot.length); + const sourceDir = nodePath.posix.dirname(vaultFilePath); + return convertMdHrefs(str, sourceDir === "." ? "" : sourceDir, (candidates) => { + let firstAttempt = null; + for (const vaultPath of candidates) { + const { attributes } = getAnchorAttributes(vaultPath); + if (!attributes.class.includes("is-unresolved")) { + return attributes; + } + firstAttempt = firstAttempt || attributes; + } + // Unresolved targets keep getAnchorAttributes' /404 behavior, matching + // how dead wikilinks are handled. + return firstAttempt; + }); + }); + + eleventyConfig.addFilter("taggify", function(str) { return ( str && - str.replace(tagRegex, function (match, precede, tag) { + str.replace(tagRegex, function(match, precede, tag) { return `${precede}
${tag}`; }) ); }); - eleventyConfig.addFilter("searchableTags", function (str) { + eleventyConfig.addFilter("stripForSearch", function(content) { + return content + .replace(/<[^>]*>/g, '') + .replace(/\s+/g, ' ') + .trim(); + }); + + eleventyConfig.addFilter("searchableTags", function(str) { let tags; let match = str && str.match(tagRegex); if (match) { @@ -315,21 +479,39 @@ module.exports = function (eleventyConfig) { } }); - eleventyConfig.addFilter("hideDataview", function (str) { + eleventyConfig.addFilter("hideDataview", function(str) { return ( str && - str.replace(/\(\S+\:\:(.*)\)/g, function (_, value) { + str.replace(/\(\S+\:\:(.*)\)/g, function(_, value) { return value.trim(); }) ); }); - eleventyConfig.addTransform("dataview-js-links", function (str) { + eleventyConfig.addFilter("xmlSafe", function(str) { + if (!str) return str; + // Remove invalid XML characters (0xFFFE, 0xFFFF, etc.) + str = str.replace(/\uFFFE|\uFFFF/g, ''); + // Escape ]]> in content to prevent CDATA issues + str = str.replace(/\]\]>/g, ']]>'); + // Self-close br, hr, and link tags + str = str.replace(//gi, '
'); + str = str.replace(//gi, '
'); + str = str.replace(/]*?)(?/gi, ''); + // Self-close img tags that aren't already self-closed + str = str.replace(/]*?)(?/gi, ''); + return str; + }); + + eleventyConfig.addTransform("dataview-js-links", function(str) { + if (!isMarkdownPage(this.page.inputPath)) { + return str; + } const parsed = parse(str); for (const dataViewJsLink of parsed.querySelectorAll("a[data-href].internal-link")) { const notePath = dataViewJsLink.getAttribute("data-href"); const title = dataViewJsLink.innerHTML; - const {attributes, innerHTML} = getAnchorAttributes(notePath, title); + const { attributes, innerHTML } = getAnchorAttributes(notePath, title); for (const key in attributes) { dataViewJsLink.setAttribute(key, attributes[key]); } @@ -339,73 +521,67 @@ module.exports = function (eleventyConfig) { return str && parsed.innerHTML; }); - eleventyConfig.addTransform("callout-block", function (str) { - const parsed = parse(str); + // Shared helper to transform callout blockquotes - used by both callout-block transform and canvas-markdown + const calloutMeta = /\[!([\w-]*)\|?(\s?.*)\](\+|\-){0,1}(\s?.*)/; + function transformCalloutBlockquotes(blockquotes) { + for (const blockquote of blockquotes) { + // Process nested blockquotes first + transformCalloutBlockquotes(blockquote.querySelectorAll("blockquote")); + + let content = blockquote.innerHTML; + + let titleDiv = ""; + let calloutType = ""; + let calloutMetaData = ""; + let isCollapsable; + let isCollapsed; + if (!content.match(calloutMeta)) { + continue; + } - const transformCalloutBlocks = ( - blockquotes = parsed.querySelectorAll("blockquote") - ) => { - for (const blockquote of blockquotes) { - transformCalloutBlocks(blockquote.querySelectorAll("blockquote")); - - let content = blockquote.innerHTML; - - let titleDiv = ""; - let calloutType = ""; - let calloutMetaData = ""; - let isCollapsable; - let isCollapsed; - const calloutMeta = /\[!([\w-]*)\|?(\s?.*)\](\+|\-){0,1}(\s?.*)/; - if (!content.match(calloutMeta)) { - continue; + content = content.replace( + calloutMeta, + function(metaInfoMatch, callout, metaData, collapse, title) { + isCollapsable = Boolean(collapse); + isCollapsed = collapse === "-"; + const titleText = title.replace(/(<\/{0,1}\w+>)/, "") + ? title + : `${callout.charAt(0).toUpperCase()}${callout + .substring(1) + .toLowerCase()}`; + const fold = isCollapsable + ? `
` + : ``; + + calloutType = callout; + calloutMetaData = metaData; + titleDiv = `
${titleText}
${fold}
`; + return ""; } + ); - content = content.replace( - calloutMeta, - function (metaInfoMatch, callout, metaData, collapse, title) { - isCollapsable = Boolean(collapse); - isCollapsed = collapse === "-"; - const titleText = title.replace(/(<\/{0,1}\w+>)/, "") - ? title - : `${callout.charAt(0).toUpperCase()}${callout - .substring(1) - .toLowerCase()}`; - const fold = isCollapsable - ? `
` - : ``; - - calloutType = callout; - calloutMetaData = metaData; - titleDiv = `
${titleText}
${fold}
`; - return ""; - } - ); - - /* Hacky fix for callouts with only a title: - This will ensure callout-content isn't produced if - the callout only has a title, like this: - ```md - > [!info] i only have a title - ``` - Not sure why content has a random

tag in it, - */ - if (content === "\n

\n") { - content = ""; - } - let contentDiv = content ? `\n

${content}
` : ""; - - blockquote.tagName = "div"; - blockquote.classList.add("callout"); - blockquote.classList.add(isCollapsable ? "is-collapsible" : ""); - blockquote.classList.add(isCollapsed ? "is-collapsed" : ""); - blockquote.setAttribute("data-callout", calloutType.toLowerCase()); - calloutMetaData && blockquote.setAttribute("data-callout-metadata", calloutMetaData); - blockquote.innerHTML = `${titleDiv}${contentDiv}`; + /* Hacky fix for callouts with only a title */ + if (content === "\n

\n") { + content = ""; } - }; - - transformCalloutBlocks(); + let contentDiv = content ? `\n

${content}
` : ""; + + blockquote.tagName = "div"; + blockquote.classList.add("callout"); + blockquote.classList.add(isCollapsable ? "is-collapsible" : ""); + blockquote.classList.add(isCollapsed ? "is-collapsed" : ""); + blockquote.setAttribute("data-callout", calloutType.toLowerCase()); + calloutMetaData && blockquote.setAttribute("data-callout-metadata", calloutMetaData); + blockquote.innerHTML = `${titleDiv}${contentDiv}`; + } + } + eleventyConfig.addTransform("callout-block", function(str) { + if (!isMarkdownPage(this.page.inputPath)) { + return str; + } + const parsed = parse(str); + transformCalloutBlockquotes(parsed.querySelectorAll("blockquote")); return str && parsed.innerHTML; }); @@ -444,14 +620,26 @@ module.exports = function (eleventyConfig) { } - eleventyConfig.addTransform("picture", function (str) { - if(process.env.USE_FULL_RESOLUTION_IMAGES === "true"){ + eleventyConfig.addTransform("picture", async function(str) { + if (!isMarkdownPage(this.page.inputPath)) { + return str; + } + if (process.env.USE_FULL_RESOLUTION_IMAGES === "true") { return str; } const parsed = parse(str); for (const imageTag of parsed.querySelectorAll(".cm-s-obsidian img")) { const src = imageTag.getAttribute("src"); if (src && src.startsWith("/") && !src.endsWith(".svg")) { + // Files sharp can't decode (e.g. HEIC or a truncated AVIF renamed + // to .jpg) keep their original tag instead of a + // pointing at optimized files that will never exist. This must be + // a real decode probe, not just a header check: feeding an + // undecodable file to eleventy-img fails the whole build via + // unhandled promise rejections in its internals. + if (!(await isDecodableImage("./src/site" + decodeURI(src)))) { + continue; + } const cls = imageTag.classList.value; const alt = imageTag.getAttribute("alt"); const width = imageTag.getAttribute("width") || ''; @@ -475,7 +663,10 @@ module.exports = function (eleventyConfig) { return str && parsed.innerHTML; }); - eleventyConfig.addTransform("table", function (str) { + eleventyConfig.addTransform("table", function(str) { + if (!isMarkdownPage(this.page.inputPath)) { + return str; + } const parsed = parse(str); for (const t of parsed.querySelectorAll(".cm-s-obsidian > table")) { let inner = t.innerHTML; @@ -501,22 +692,108 @@ module.exports = function (eleventyConfig) { return str && parsed.innerHTML; }); - eleventyConfig.addTransform("htmlMinifier", (content, outputPath) => { + // Helper function to convert wiki-links in canvas text nodes (same logic as link filter) + function convertCanvasLinks(str) { + return ( + str && + str.replace(/\[\[(.*?\|.*?)\]\]/g, function(match, p1) { + if (p1.indexOf("],[") > -1 || p1.indexOf('"$"') > -1) { + return match; + } + const [fileLink, linkTitle] = p1.split("|"); + return getAnchorLink(fileLink, linkTitle); + }) + ); + } + + // Helper function to convert tags in canvas text nodes (same logic as taggify filter) + function convertCanvasTags(str) { + return ( + str && + str.replace(tagRegex, function(match, precede, tag) { + return `${precede}${tag}`; + }) + ); + } + + // Render markdown in canvas text nodes at build time + eleventyConfig.addTransform("canvas-markdown", function(str) { + if (!str || !str.includes('data-markdown="')) { + return str; + } + + try { + const parsed = parse(str); + for (const textNode of parsed.querySelectorAll('.canvas-node-text-content[data-markdown]')) { + const base64Content = textNode.getAttribute('data-markdown'); + if (base64Content) { + try { + const markdown = Buffer.from(base64Content, 'base64').toString('utf8'); + // Render markdown + let rendered = markdownLib.render(markdown); + // Apply wiki-link conversion (same as link filter) + rendered = convertCanvasLinks(rendered); + // Apply tag conversion (same as taggify filter) + rendered = convertCanvasTags(rendered); + // Apply callout transformation (reuse shared helper) + const renderedParsed = parse(rendered); + transformCalloutBlockquotes(renderedParsed.querySelectorAll("blockquote")); + rendered = renderedParsed.innerHTML; + textNode.innerHTML = rendered; + textNode.removeAttribute('data-markdown'); + } catch (e) { + // If markdown rendering fails, show raw text as fallback + console.error('Failed to render canvas markdown:', e); + const rawText = Buffer.from(base64Content, 'base64').toString('utf8'); + textNode.innerHTML = `
${rawText}
`; + textNode.removeAttribute('data-markdown'); + } + } + } + return parsed.innerHTML; + } catch (e) { + // If parsing fails entirely, return original content + console.error('Failed to parse canvas content:', e); + return str; + } + }); + + eleventyConfig.addTransform("htmlMinifier", async function(content) { + if ( + (process.env.NODE_ENV === "production" || process.env.ELEVENTY_ENV === "prod") && + (this.page.outputPath || "").endsWith(".html") + ) { + try { + return await htmlMinifier.minify(content, { + useShortDoctype: true, + removeComments: true, + collapseWhitespace: true, + conservativeCollapse: true, + preserveLineBreaks: true, + minifyCSS: true, + minifyJS: true, + keepClosingSlash: true, + }); + } catch { + // If the html minifying fails for some reason due to some malformed text, just return the content as is. + return content; + } + } + return content; + }); + + eleventyConfig.addTransform("jsonMinifier", async (content, outputPath) => { if ( (process.env.NODE_ENV === "production" || process.env.ELEVENTY_ENV === "prod") && outputPath && - outputPath.endsWith(".html") + outputPath.endsWith(".json") ) { - return htmlMinifier.minify(content, { - useShortDoctype: true, - removeComments: true, - collapseWhitespace: true, - conservativeCollapse: true, - preserveLineBreaks: true, - minifyCSS: true, - minifyJS: true, - keepClosingSlash: true, - }); + try { + return JSON.stringify(JSON.parse(content)); + } catch { + // If the JSON minifying fails for some reason due to malformed JSON, just return the content as is. + return content; + } } return content; }); @@ -524,26 +801,55 @@ module.exports = function (eleventyConfig) { eleventyConfig.addPassthroughCopy("src/site/img"); eleventyConfig.addPassthroughCopy("src/site/scripts"); eleventyConfig.addPassthroughCopy("src/site/styles/_theme.*.css"); + eleventyConfig.addPassthroughCopy({ "src/site/logo.*": "/" }); + eleventyConfig.on("eleventy.before", () => { + normalizeFavicon(FAVICON_SOURCE, FAVICON_NORMALIZED); + }); + eleventyConfig.on("eleventy.after", async () => { + if (pendingImageJobs.length > 0) { + console.log(`[image] Waiting for ${pendingImageJobs.length} image optimization jobs...`); + await Promise.all(pendingImageJobs); + console.log(`[image] Image optimization complete`); + pendingImageJobs.length = 0; + } + }); + eleventyConfig.addWatchTarget(FAVICON_SOURCE); eleventyConfig.addPlugin(faviconsPlugin, { outputDir: "dist" }); eleventyConfig.addPlugin(tocPlugin, { ul: true, tags: ["h1", "h2", "h3", "h4", "h5", "h6"], }); + // Canvas files are pre-compiled HTML by the plugin - don't process as markdown + eleventyConfig.addExtension("canvas", { + read: true, + compile: async function(inputContent, inputPath) { + // Extract content after frontmatter (canvas HTML is already compiled by plugin) + const parsed = matter(inputContent, matterOptions); + return async (data) => { + // Return the HTML content directly without markdown processing + return parsed.content; + }; + } + }); - eleventyConfig.addFilter("dateToZulu", function (date) { + eleventyConfig.addFilter("dateToZulu", function(date) { try { return new Date(date).toISOString("dd-MM-yyyyTHH:mm:ssZ"); } catch { return ""; } }); - - eleventyConfig.addFilter("jsonify", function (variable) { + + eleventyConfig.addFilter("jsonify", function(variable) { return JSON.stringify(variable) || '""'; }); - eleventyConfig.addFilter("validJson", function (variable) { + eleventyConfig.addFilter("notHidden", function (arr) { + return (arr || []).filter((item) => !item.data.hide); + }); + + eleventyConfig.addFilter("validJson", function(variable) { if (Array.isArray(variable)) { return variable.map((x) => x.replaceAll("\\", "\\\\")).join(","); } else if (typeof variable === "string") { @@ -567,7 +873,7 @@ module.exports = function (eleventyConfig) { output: "dist", data: `_data`, }, - templateFormats: ["njk", "md", "11ty.js"], + templateFormats: ["njk", "md", "11ty.js", "canvas"], htmlTemplateEngine: "njk", markdownTemplateEngine: false, passthroughFileCopy: true, diff --git a/.env b/.env index fb6fca2701..38669a3df1 100644 --- a/.env +++ b/.env @@ -1,3 +1,26 @@ -THEME=https://raw.githubusercontent.com/seanwcom/Red-Graphite-for-Obsidian/HEAD/theme.css +SITE_NAME_HEADER=Digital Garden +SITE_MAIN_LANGUAGE=en +SITE_BASE_URL=https://anapoly.netlify.app +SHOW_CREATED_TIMESTAMP=false +TIMESTAMP_FORMAT=MMM dd, yyyy h:mm a +SHOW_UPDATED_TIMESTAMP=false +NOTE_ICON_DEFAULT= +NOTE_ICON_TITLE=false +NOTE_ICON_FILETREE=false +NOTE_ICON_INTERNAL_LINKS=false +NOTE_ICON_BACK_LINKS=false +STYLE_SETTINGS_CSS= +STYLE_SETTINGS_BODY_CLASSES= +USE_FULL_RESOLUTION_IMAGES=false +THEME=https://raw.githubusercontent.com/kepano/obsidian-minimal/HEAD/theme.css BASE_THEME=dark dgHomeLink=true +dgPassFrontmatter=false +dgShowBacklinks=false +dgShowLocalGraph=false +dgShowInlineTitle=false +dgShowFileTree=false +dgEnableSearch=false +dgShowToc=false +dgLinkPreview=false +dgShowTags=false \ No newline at end of file diff --git a/README.md b/README.md index e402070dd3..b9cba00a0d 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,209 @@ # Digital Obsidian Garden -This is the template to be used together with the [Digital Garden Obsidian Plugin](https://github.com/oleeskild/Obsidian-Digital-Garden). +This is the template to be used together with the [Digital Garden Obsidian Plugin](https://github.com/oleeskild/Obsidian-Digital-Garden). See the README in the plugin repo for information on how to set it up. [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/oleeskild/digitalgarden) --- ## Docs -Docs are available at [dg-docs.ole.dev](https://dg-docs.ole.dev/) +Docs are available at [docs.forestry.md](https://docs.forestry.md/) + +--- +## CSS Variables + +The digital garden is fully customizable through CSS variables. Override these in `src/site/styles/custom-style.scss` to customize your garden's appearance. + +### How to Customize + +Add your overrides to `custom-style.scss`: + +```scss +body { + --dg-content-max-width: 800px; + --dg-content-font-size: 16px; + --dg-sidebar-max-width: 400px; +} +``` + +### Responsive Layout Notes + +- Content will never overlap the filetree, regardless of `--dg-content-max-width` value +- The right sidebar (TOC/graph/backlinks) automatically hides when there isn't enough viewport space +- To make the sidebar appear at smaller viewports, reduce `--dg-sidebar-max-width` + +### Available Variables + +#### Color Variables +You can override the base Obsidian theme color variables directly: + +| Variable | Description | +|----------|-------------| +| `--text-normal` | Normal text color | +| `--text-muted` | Muted/secondary text | +| `--text-faint` | Faint text | +| `--text-accent` | Accent color | +| `--text-accent-hover` | Accent hover color | +| `--link-color` | Link color | +| `--link-color-hover` | Link color hover | +| `--link-unresolved-color` | Link color unresolved | +| `--link-unresolved-opacity` | Link color unresolved opacity | +| `--background-primary` | Primary background | +| `--background-primary-alt` | Alt primary background | +| `--background-secondary` | Secondary background | +| `--background-secondary-alt` | Alt secondary background | +| `--interactive-normal` | Interactive element color | +| `--interactive-hover` | Interactive hover color | +| `--interactive-accent` | Interactive accent | +| `--interactive-accent-hover` | Interactive accent hover | + +#### Layout Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `--dg-content-max-width` | `700px` | Maximum width of content area | +| `--dg-content-margin-top` | `90px` | Top margin for content | +| `--dg-content-margin-top-mobile` | `75px` | Top margin on mobile | +| `--dg-content-font-size` | `18px` | Base font size for content | +| `--dg-content-line-height` | `1.5` | Line height for content | + +#### Sidebar (Right) Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `--dg-sidebar-top` | `75px` | Sidebar top offset | +| `--dg-sidebar-gap` | `80px` | Gap between content and sidebar | +| `--dg-sidebar-min-width` | `25px` | Minimum sidebar width | +| `--dg-sidebar-max-width` | `350px` | Maximum sidebar width | +| `--dg-sidebar-container-padding` | `20px` | Sidebar container padding | +| `--dg-sidebar-container-height` | `87%` | Sidebar container height | + +#### Graph Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `--dg-graph-width` | `250px` | Local graph width | +| `--dg-graph-height` | `250px` | Local graph height | +| `--dg-graph-border-radius` | `10px` | Graph border radius | +| `--dg-graph-margin-bottom` | `20px` | Graph bottom margin | +| `--dg-graph-fullscreen-width` | `90vw` | Expanded/global graph width | +| `--dg-graph-fullscreen-height` | `85vh` | Expanded/global graph height | +| `--dg-graph-node-color` | `var(--text-accent)` | Active/current node color | +| `--dg-graph-node-color-muted` | `var(--text-faint)` | Neighbor node color | +| `--dg-graph-label-color` | `var(--text-normal)` | Node label text color | +| `--dg-graph-bg` | `var(--background-primary)` | Graph background color | +| `--dg-graph-border-color` | `var(--background-secondary)` | Graph border color | + +#### Filetree (Left Sidebar) Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `--dg-filetree-width` | `250px` | Filetree sidebar width | +| `--dg-filetree-min-width` | `250px` | Minimum filetree width | +| `--dg-filetree-padding` | `10px 20px` | Filetree padding | +| `--dg-filetree-gap` | `80px` | Gap from content | +| `--dg-filetree-title-size` | `32px` | Filetree title font size | + +#### TOC (Table of Contents) Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `--dg-toc-padding` | `5px` | TOC container padding | +| `--dg-toc-font-size` | `0.9rem` | TOC font size | +| `--dg-toc-max-height` | `220px` | TOC max height | +| `--dg-toc-title-size` | `1.2rem` | TOC title font size | +| `--dg-toc-item-padding` | `2px 0 2px 8px` | TOC item padding | +| `--dg-toc-indent` | `1em` | TOC nested list indent | + +#### Backlinks Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `--dg-backlinks-margin-top` | `10px` | Backlinks section top margin | +| `--dg-backlinks-max-height` | `250px` | Backlinks list max height | +| `--dg-backlinks-title-size` | `0.9rem` | Backlinks title font size | +| `--dg-backlinks-card-size` | `0.85rem` | Backlink card font size | +| `--dg-backlinks-card-padding` | `6px 0` | Backlink card padding | +| `--dg-backlinks-icon-size` | `14px` | Backlink icon size | + +#### Search Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `--dg-search-box-width` | `900px` | Search box width | +| `--dg-search-box-max-width` | `80%` | Search box max width | +| `--dg-search-box-radius` | `15px` | Search box border radius | +| `--dg-search-box-padding` | `10px` | Search box padding | +| `--dg-search-input-size` | `2rem` | Search input font size | +| `--dg-search-input-padding` | `10px` | Search input padding | +| `--dg-search-input-radius` | `5px` | Search input border radius | +| `--dg-search-results-max-height` | `50vh` | Search results max height | +| `--dg-search-result-size` | `1.2rem` | Search result font size | +| `--dg-search-result-radius` | `10px` | Search result border radius | +| `--dg-search-link-size` | `1.4rem` | Search link font size | + +#### Search Button Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `--dg-search-btn-radius` | `8px` | Search button border radius | +| `--dg-search-btn-height` | `32px` | Search button height | +| `--dg-search-btn-padding` | `0 10px` | Search button padding | +| `--dg-search-btn-gap` | `8px` | Search button icon/text gap | +| `--dg-search-btn-font-size` | `0.85rem` | Search button font size | +| `--dg-search-btn-icon-size` | `14px` | Search button icon size | + +#### Navbar Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `--dg-navbar-title-size-mobile` | `18px` | Navbar title size on mobile | +| `--dg-navbar-search-margin` | `20px` | Navbar search button margin | +| `--dg-navbar-search-min-width` | `36px` | Navbar search min width | +| `--dg-logo-height` | `40px` | Site logo height on desktop | +| `--dg-logo-height-mobile` | `32px` | Site logo height on mobile | +| `--dg-logo-margin` | `10px 15px` | Site logo margin | +| `--dg-filetree-logo-height` | `70px` | Site logo height in filetree sidebar | + +#### Note Link / Filetree Item Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `--dg-notelink-padding` | `4px 8px 4px 12px` | Note link padding | +| `--dg-notelink-size` | `0.85rem` | Note link font size | +| `--dg-notelink-border-width` | `2px` | Note link left border width | +| `--dg-notelink-hover-bg` | `rgba(255, 255, 255, 0.05)` | Note link hover background | +| `--dg-folder-margin` | `4px 0 4px 2px` | Folder name margin | +| `--dg-folder-icon-size` | `14px` | Folder icon size | +| `--dg-inner-folder-padding` | `3px 0 3px 0` | Inner folder padding | +| `--dg-inner-folder-margin` | `12px` | Inner folder left margin | +| `--dg-filelist-margin` | `8px` | File list left margin | + +#### Graph Controls Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `--dg-graph-ctrl-padding` | `6px 10px` | Graph controls padding | +| `--dg-graph-ctrl-radius` | `6px` | Graph controls border radius | +| `--dg-graph-ctrl-margin` | `10px` | Graph controls margin | +| `--dg-graph-ctrl-size` | `0.7rem` | Graph controls font size | +| `--dg-graph-ctrl-icon-size` | `14px` | Graph control icon size | +| `--dg-graph-ctrl-gap` | `10px` | Graph controls gap | + +#### Timestamps Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `--dg-timestamps-size` | `0.8em` | Timestamps font size | +| `--dg-timestamps-gap` | `10px` | Timestamps gap | +| `--dg-timestamps-margin-top` | `20px` | Timestamps top margin | + +#### Misc Component Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `--dg-overlay-bg` | `rgba(0, 0, 0, 0.5)` | Overlay background color | +| `--dg-mermaid-radius` | `25px` | Mermaid diagram border radius | +| `--dg-mermaid-padding` | `10px` | Mermaid diagram padding | +| `--dg-transclusion-padding` | `8px` | Transclusion container padding | +| `--dg-external-link-icon-size` | `13px` | External link icon size | +| `--dg-external-link-padding` | `16px` | External link right padding | diff --git a/callout-grid-2.1.css b/callout-grid-2.1.css new file mode 100644 index 0000000000..c7c9b97279 --- /dev/null +++ b/callout-grid-2.1.css @@ -0,0 +1,890 @@ +/** + * [Callout] simple grid-card. CSS + * how to use this: https://forum.obsidian.md/t/css-snippet-to-display-markdown-in-grids-without-html/95117 + * + * Version : 2.0 + * Author : Wendystraite + * + **/ + +/* Callout grid options */ + +body { + --x-grid-padding: 0.6em; + --x-grid-border-width: 1px; + --x-grid-border-radius: var(--callout-radius, 3px); + --x-grid-border-opacity: 80%; + --x-grid-bg-opacity: 15%; + --x-grid-border-color: hsla(200, 15%, 39%, var(--x-grid-border-opacity)); + --x-grid-bg-color: hsla(200, 15%, 39%, var(--x-grid-bg-opacity)); + --x-grid-gap: 0.75rem; + --x-grid-margin-bottom: 2rem; +} + +/* Callout grid */ + +.callout[data-callout*="grid"]:not([data-callout*="grid-item"]) { + /* Hide grid & grid-item callout and main background */ + :is(&, & > .callout-content > .callout[data-callout*="grid-item"]) { + &, + & > .callout-content { + padding: 0; + margin: 0; + border: 0; + background-color: transparent; + } + + .markdown-source-view.mod-cm6 .callout-content & { + margin: 0; + } + + & > .callout-title { + display: none; + } + } + + /* Remove any other callout as grid item margin */ + + & > .callout-content > .callout, + .markdown-source-view.mod-cm6 + .callout-content + & + > .callout-content + > .callout { + margin: 0; + } + + /* Add margin to the bottom if next element is not a div / hr */ + + :is(.el-div, .markdown-rendered):has(> &):has(+ *:not(.el-div, .el-hr)) { + margin-block-end: var(--x-grid-margin-bottom); + } + + /* Add margin between multiple grid callouts */ + + .el-div:has(&) + .el-div { + margin-block-start: var(--x-grid-padding); + } + + /* OP code : makes that all ul's children are included in callout's grid items + so we don't have to write 2 grids and 2 selectors every time */ + + & > .callout-content > ul { + display: contents; + } + + /* Grid with li as grid items ... */ + + & > .callout-content > ul { + /* Grid with li as grid items : don't show ul / li */ + + &, + & > li > ul { + list-style-type: none; + } + + & > li, + & > li > ul > li { + display: block; + margin-inline-start: unset; + } + + /* Grid with li as grid items : don't show list bullets in preview mode */ + + & > li > .list-bullet, + & > li > ul > li > .list-bullet { + display: none; + } + } + + /* Grid items margin */ + + /* By default lists and other elements in callouts have too much margin-block, avoid that */ + + & + > .callout-content + > .callout + > .callout-content + > :is(ul, ol, p, h1, h2, h3, h4, h5, h6) { + margin-block: var(--x-grid-padding); + } + + /* Grid with li as grid items ... */ + + & > .callout-content > ul { + /* Grid with li as grid items : don't show ul's margin */ + + & { + margin-block-start: 0; + margin-block-end: 0; + } + + /* Grid with li as grid items : have lower initial margin for nested lists */ + + & > li > ul > li > ul > li { + margin-inline-start: 3ch; + } + + /* Grid with li as grid items : don't show indent */ + + & > li::before, + & > li > ul::before, + & > li > ul > li::before, + & > li > ul > li > ul::before, + & > li > ul::after, + & > li > ul > li > ul::after { + display: none; + } + } + + /* Grid : col/row spans */ + + /* prettier-ignore */ + & > .callout-content > .callout { + &[data-callout*="col-span-2"] { grid-column: 2 span; } + &[data-callout*="col-span-3"] { grid-column: 3 span; } + &[data-callout*="col-span-4"] { grid-column: 4 span; } + &[data-callout*="col-span-5"] { grid-column: 5 span; } + &[data-callout*="col-span-6"] { grid-column: 6 span; } + &[data-callout*="col-span-7"] { grid-column: 7 span; } + &[data-callout*="col-span-8"] { grid-column: 8 span; } + + &[data-callout*="row-span-2"] { grid-row: 2 span; } + &[data-callout*="row-span-3"] { grid-row: 3 span; } + &[data-callout*="row-span-4"] { grid-row: 4 span; } + &[data-callout*="row-span-5"] { grid-row: 5 span; } + &[data-callout*="row-span-6"] { grid-row: 6 span; } + &[data-callout*="row-span-7"] { grid-row: 7 span; } + &[data-callout*="row-span-8"] { grid-row: 8 span; } + } + + /* Grid */ + + &:not([data-callout*="grid-auto"]) > .callout-content { + display: grid; + grid-template-columns: var(--x-grid-template-columns); + } + + /* Grid : Column sizes */ + + /* prettier-ignore */ + & { + --x-grid-template-columns-all-col-size: auto; + --x-grid-template-columns-col-1-size: var(--x-grid-template-columns-all-col-size); + --x-grid-template-columns-col-2-size: var(--x-grid-template-columns-all-col-size); + --x-grid-template-columns-col-3-size: var(--x-grid-template-columns-all-col-size); + --x-grid-template-columns-col-4-size: var(--x-grid-template-columns-all-col-size); + --x-grid-template-columns-col-5-size: var(--x-grid-template-columns-all-col-size); + --x-grid-template-columns-col-6-size: var(--x-grid-template-columns-all-col-size); + --x-grid-template-columns-col-7-size: var(--x-grid-template-columns-all-col-size); + --x-grid-template-columns-col-8-size: var(--x-grid-template-columns-all-col-size); + } + + /* Grid : All columns sizes / same width */ + + &:is( + [data-callout*="all-col-1"], + [data-callout*="same-width"], + [data-callout*="grid-card"] + ) { + --x-grid-template-columns-all-col-size: 1fr; + } + + /* prettier-ignore */ + & { + &[data-callout*="all-col-1"] { --x-grid-template-columns-all-col-size: 1fr; } + &[data-callout*="all-col-2"] { --x-grid-template-columns-all-col-size: 2fr; } + &[data-callout*="all-col-3"] { --x-grid-template-columns-all-col-size: 3fr; } + &[data-callout*="all-col-4"] { --x-grid-template-columns-all-col-size: 4fr; } + &[data-callout*="all-col-5"] { --x-grid-template-columns-all-col-size: 5fr; } + &[data-callout*="all-col-6"] { --x-grid-template-columns-all-col-size: 6fr; } + &[data-callout*="all-col-7"] { --x-grid-template-columns-all-col-size: 7fr; } + &[data-callout*="all-col-8"] { --x-grid-template-columns-all-col-size: 8fr; } + + @media screen and (min-width: 750px) and (max-width: 1000px) { + &[data-callout*="all-tablet-col-1"] { --x-grid-template-columns-all-col-size: 1fr; } + &[data-callout*="all-tablet-col-2"] { --x-grid-template-columns-all-col-size: 2fr; } + &[data-callout*="all-tablet-col-3"] { --x-grid-template-columns-all-col-size: 3fr; } + &[data-callout*="all-tablet-col-4"] { --x-grid-template-columns-all-col-size: 4fr; } + &[data-callout*="all-tablet-col-5"] { --x-grid-template-columns-all-col-size: 5fr; } + &[data-callout*="all-tablet-col-6"] { --x-grid-template-columns-all-col-size: 6fr; } + &[data-callout*="all-tablet-col-7"] { --x-grid-template-columns-all-col-size: 7fr; } + &[data-callout*="all-tablet-col-8"] { --x-grid-template-columns-all-col-size: 8fr; } + } + + @media screen and (max-width: 750px) { + &[data-callout*="all-mobile-col-1"] { --x-grid-template-columns-all-col-size: 1fr; } + &[data-callout*="all-mobile-col-2"] { --x-grid-template-columns-all-col-size: 2fr; } + &[data-callout*="all-mobile-col-3"] { --x-grid-template-columns-all-col-size: 3fr; } + &[data-callout*="all-mobile-col-4"] { --x-grid-template-columns-all-col-size: 4fr; } + &[data-callout*="all-mobile-col-5"] { --x-grid-template-columns-all-col-size: 5fr; } + &[data-callout*="all-mobile-col-6"] { --x-grid-template-columns-all-col-size: 6fr; } + &[data-callout*="all-mobile-col-7"] { --x-grid-template-columns-all-col-size: 7fr; } + &[data-callout*="all-mobile-col-8"] { --x-grid-template-columns-all-col-size: 8fr; } + } + } + + /* Grid : Specific widths */ + + /* prettier-ignore */ + & { + &[data-callout*="col-1-auto"] { --x-grid-template-columns-col-1-size: auto; } + &[data-callout*="col-1-1"] { --x-grid-template-columns-col-1-size: 1fr; } + &[data-callout*="col-1-2"] { --x-grid-template-columns-col-1-size: 2fr; } + &[data-callout*="col-1-3"] { --x-grid-template-columns-col-1-size: 3fr; } + &[data-callout*="col-1-4"] { --x-grid-template-columns-col-1-size: 4fr; } + &[data-callout*="col-1-5"] { --x-grid-template-columns-col-1-size: 5fr; } + &[data-callout*="col-1-6"] { --x-grid-template-columns-col-1-size: 6fr; } + &[data-callout*="col-1-7"] { --x-grid-template-columns-col-1-size: 7fr; } + &[data-callout*="col-1-8"] { --x-grid-template-columns-col-1-size: 8fr; } + + &[data-callout*="col-2-auto"] { --x-grid-template-columns-col-2-size: auto; } + &[data-callout*="col-2-1"] { --x-grid-template-columns-col-2-size: 1fr; } + &[data-callout*="col-2-2"] { --x-grid-template-columns-col-2-size: 2fr; } + &[data-callout*="col-2-3"] { --x-grid-template-columns-col-2-size: 3fr; } + &[data-callout*="col-2-4"] { --x-grid-template-columns-col-2-size: 4fr; } + &[data-callout*="col-2-5"] { --x-grid-template-columns-col-2-size: 5fr; } + &[data-callout*="col-2-6"] { --x-grid-template-columns-col-2-size: 6fr; } + &[data-callout*="col-2-7"] { --x-grid-template-columns-col-2-size: 7fr; } + &[data-callout*="col-2-8"] { --x-grid-template-columns-col-2-size: 8fr; } + + &[data-callout*="col-3-auto"] { --x-grid-template-columns-col-3-size: auto; } + &[data-callout*="col-3-1"] { --x-grid-template-columns-col-3-size: 1fr; } + &[data-callout*="col-3-2"] { --x-grid-template-columns-col-3-size: 2fr; } + &[data-callout*="col-3-3"] { --x-grid-template-columns-col-3-size: 3fr; } + &[data-callout*="col-3-4"] { --x-grid-template-columns-col-3-size: 4fr; } + &[data-callout*="col-3-5"] { --x-grid-template-columns-col-3-size: 5fr; } + &[data-callout*="col-3-6"] { --x-grid-template-columns-col-3-size: 6fr; } + &[data-callout*="col-3-7"] { --x-grid-template-columns-col-3-size: 7fr; } + &[data-callout*="col-3-8"] { --x-grid-template-columns-col-3-size: 8fr; } + + &[data-callout*="col-4-auto"] { --x-grid-template-columns-col-4-size: auto; } + &[data-callout*="col-4-1"] { --x-grid-template-columns-col-4-size: 1fr; } + &[data-callout*="col-4-2"] { --x-grid-template-columns-col-4-size: 2fr; } + &[data-callout*="col-4-3"] { --x-grid-template-columns-col-4-size: 3fr; } + &[data-callout*="col-4-4"] { --x-grid-template-columns-col-4-size: 4fr; } + &[data-callout*="col-4-5"] { --x-grid-template-columns-col-4-size: 5fr; } + &[data-callout*="col-4-6"] { --x-grid-template-columns-col-4-size: 6fr; } + &[data-callout*="col-4-7"] { --x-grid-template-columns-col-4-size: 7fr; } + &[data-callout*="col-4-8"] { --x-grid-template-columns-col-4-size: 8fr; } + + &[data-callout*="col-5-auto"] { --x-grid-template-columns-col-5-size: auto; } + &[data-callout*="col-5-1"] { --x-grid-template-columns-col-5-size: 1fr; } + &[data-callout*="col-5-2"] { --x-grid-template-columns-col-5-size: 2fr; } + &[data-callout*="col-5-3"] { --x-grid-template-columns-col-5-size: 3fr; } + &[data-callout*="col-5-4"] { --x-grid-template-columns-col-5-size: 4fr; } + &[data-callout*="col-5-5"] { --x-grid-template-columns-col-5-size: 5fr; } + &[data-callout*="col-5-6"] { --x-grid-template-columns-col-5-size: 6fr; } + &[data-callout*="col-5-7"] { --x-grid-template-columns-col-5-size: 7fr; } + &[data-callout*="col-5-8"] { --x-grid-template-columns-col-5-size: 8fr; } + + &[data-callout*="col-6-auto"] { --x-grid-template-columns-col-6-size: auto; } + &[data-callout*="col-6-1"] { --x-grid-template-columns-col-6-size: 1fr; } + &[data-callout*="col-6-2"] { --x-grid-template-columns-col-6-size: 2fr; } + &[data-callout*="col-6-3"] { --x-grid-template-columns-col-6-size: 3fr; } + &[data-callout*="col-6-4"] { --x-grid-template-columns-col-6-size: 4fr; } + &[data-callout*="col-6-5"] { --x-grid-template-columns-col-6-size: 5fr; } + &[data-callout*="col-6-6"] { --x-grid-template-columns-col-6-size: 6fr; } + &[data-callout*="col-6-7"] { --x-grid-template-columns-col-6-size: 7fr; } + &[data-callout*="col-6-8"] { --x-grid-template-columns-col-6-size: 8fr; } + + &[data-callout*="col-7-auto"] { --x-grid-template-columns-col-7-size: auto; } + &[data-callout*="col-7-1"] { --x-grid-template-columns-col-7-size: 1fr; } + &[data-callout*="col-7-2"] { --x-grid-template-columns-col-7-size: 2fr; } + &[data-callout*="col-7-3"] { --x-grid-template-columns-col-7-size: 3fr; } + &[data-callout*="col-7-4"] { --x-grid-template-columns-col-7-size: 4fr; } + &[data-callout*="col-7-5"] { --x-grid-template-columns-col-7-size: 5fr; } + &[data-callout*="col-7-6"] { --x-grid-template-columns-col-7-size: 6fr; } + &[data-callout*="col-7-7"] { --x-grid-template-columns-col-7-size: 7fr; } + &[data-callout*="col-7-8"] { --x-grid-template-columns-col-7-size: 8fr; } + + &[data-callout*="col-8-auto"] { --x-grid-template-columns-col-8-size: auto; } + &[data-callout*="col-8-1"] { --x-grid-template-columns-col-8-size: 1fr; } + &[data-callout*="col-8-2"] { --x-grid-template-columns-col-8-size: 2fr; } + &[data-callout*="col-8-3"] { --x-grid-template-columns-col-8-size: 3fr; } + &[data-callout*="col-8-4"] { --x-grid-template-columns-col-8-size: 4fr; } + &[data-callout*="col-8-5"] { --x-grid-template-columns-col-8-size: 5fr; } + &[data-callout*="col-8-6"] { --x-grid-template-columns-col-8-size: 6fr; } + &[data-callout*="col-8-7"] { --x-grid-template-columns-col-8-size: 7fr; } + &[data-callout*="col-8-8"] { --x-grid-template-columns-col-8-size: 8fr; } + } + + /* prettier-ignore */ + @media screen and (min-width: 750px) and (max-width: 1000px) { + &[data-callout*="tablet-col-1-auto"] { --x-grid-template-columns-col-1-size: auto; } + &[data-callout*="tablet-col-1-1"] { --x-grid-template-columns-col-1-size: 1fr; } + &[data-callout*="tablet-col-1-2"] { --x-grid-template-columns-col-1-size: 2fr; } + &[data-callout*="tablet-col-1-3"] { --x-grid-template-columns-col-1-size: 3fr; } + &[data-callout*="tablet-col-1-4"] { --x-grid-template-columns-col-1-size: 4fr; } + &[data-callout*="tablet-col-1-5"] { --x-grid-template-columns-col-1-size: 5fr; } + &[data-callout*="tablet-col-1-6"] { --x-grid-template-columns-col-1-size: 6fr; } + &[data-callout*="tablet-col-1-7"] { --x-grid-template-columns-col-1-size: 7fr; } + &[data-callout*="tablet-col-1-8"] { --x-grid-template-columns-col-1-size: 8fr; } + + &[data-callout*="tablet-col-2-auto"] { --x-grid-template-columns-col-2-size: auto; } + &[data-callout*="tablet-col-2-1"] { --x-grid-template-columns-col-2-size: 1fr; } + &[data-callout*="tablet-col-2-2"] { --x-grid-template-columns-col-2-size: 2fr; } + &[data-callout*="tablet-col-2-3"] { --x-grid-template-columns-col-2-size: 3fr; } + &[data-callout*="tablet-col-2-4"] { --x-grid-template-columns-col-2-size: 4fr; } + &[data-callout*="tablet-col-2-5"] { --x-grid-template-columns-col-2-size: 5fr; } + &[data-callout*="tablet-col-2-6"] { --x-grid-template-columns-col-2-size: 6fr; } + &[data-callout*="tablet-col-2-7"] { --x-grid-template-columns-col-2-size: 7fr; } + &[data-callout*="tablet-col-2-8"] { --x-grid-template-columns-col-2-size: 8fr; } + + &[data-callout*="tablet-col-3-auto"] { --x-grid-template-columns-col-3-size: auto; } + &[data-callout*="tablet-col-3-1"] { --x-grid-template-columns-col-3-size: 1fr; } + &[data-callout*="tablet-col-3-2"] { --x-grid-template-columns-col-3-size: 2fr; } + &[data-callout*="tablet-col-3-3"] { --x-grid-template-columns-col-3-size: 3fr; } + &[data-callout*="tablet-col-3-4"] { --x-grid-template-columns-col-3-size: 4fr; } + &[data-callout*="tablet-col-3-5"] { --x-grid-template-columns-col-3-size: 5fr; } + &[data-callout*="tablet-col-3-6"] { --x-grid-template-columns-col-3-size: 6fr; } + &[data-callout*="tablet-col-3-7"] { --x-grid-template-columns-col-3-size: 7fr; } + &[data-callout*="tablet-col-3-8"] { --x-grid-template-columns-col-3-size: 8fr; } + + &[data-callout*="tablet-col-4-auto"] { --x-grid-template-columns-col-4-size: auto; } + &[data-callout*="tablet-col-4-1"] { --x-grid-template-columns-col-4-size: 1fr; } + &[data-callout*="tablet-col-4-2"] { --x-grid-template-columns-col-4-size: 2fr; } + &[data-callout*="tablet-col-4-3"] { --x-grid-template-columns-col-4-size: 3fr; } + &[data-callout*="tablet-col-4-4"] { --x-grid-template-columns-col-4-size: 4fr; } + &[data-callout*="tablet-col-4-5"] { --x-grid-template-columns-col-4-size: 5fr; } + &[data-callout*="tablet-col-4-6"] { --x-grid-template-columns-col-4-size: 6fr; } + &[data-callout*="tablet-col-4-7"] { --x-grid-template-columns-col-4-size: 7fr; } + &[data-callout*="tablet-col-4-8"] { --x-grid-template-columns-col-4-size: 8fr; } + + &[data-callout*="tablet-col-5-auto"] { --x-grid-template-columns-col-5-size: auto; } + &[data-callout*="tablet-col-5-1"] { --x-grid-template-columns-col-5-size: 1fr; } + &[data-callout*="tablet-col-5-2"] { --x-grid-template-columns-col-5-size: 2fr; } + &[data-callout*="tablet-col-5-3"] { --x-grid-template-columns-col-5-size: 3fr; } + &[data-callout*="tablet-col-5-4"] { --x-grid-template-columns-col-5-size: 4fr; } + &[data-callout*="tablet-col-5-5"] { --x-grid-template-columns-col-5-size: 5fr; } + &[data-callout*="tablet-col-5-6"] { --x-grid-template-columns-col-5-size: 6fr; } + &[data-callout*="tablet-col-5-7"] { --x-grid-template-columns-col-5-size: 7fr; } + &[data-callout*="tablet-col-5-8"] { --x-grid-template-columns-col-5-size: 8fr; } + + &[data-callout*="tablet-col-6-auto"] { --x-grid-template-columns-col-6-size: auto; } + &[data-callout*="tablet-col-6-1"] { --x-grid-template-columns-col-6-size: 1fr; } + &[data-callout*="tablet-col-6-2"] { --x-grid-template-columns-col-6-size: 2fr; } + &[data-callout*="tablet-col-6-3"] { --x-grid-template-columns-col-6-size: 3fr; } + &[data-callout*="tablet-col-6-4"] { --x-grid-template-columns-col-6-size: 4fr; } + &[data-callout*="tablet-col-6-5"] { --x-grid-template-columns-col-6-size: 5fr; } + &[data-callout*="tablet-col-6-6"] { --x-grid-template-columns-col-6-size: 6fr; } + &[data-callout*="tablet-col-6-7"] { --x-grid-template-columns-col-6-size: 7fr; } + &[data-callout*="tablet-col-6-8"] { --x-grid-template-columns-col-6-size: 8fr; } + + &[data-callout*="tablet-col-7-auto"] { --x-grid-template-columns-col-7-size: auto; } + &[data-callout*="tablet-col-7-1"] { --x-grid-template-columns-col-7-size: 1fr; } + &[data-callout*="tablet-col-7-2"] { --x-grid-template-columns-col-7-size: 2fr; } + &[data-callout*="tablet-col-7-3"] { --x-grid-template-columns-col-7-size: 3fr; } + &[data-callout*="tablet-col-7-4"] { --x-grid-template-columns-col-7-size: 4fr; } + &[data-callout*="tablet-col-7-5"] { --x-grid-template-columns-col-7-size: 5fr; } + &[data-callout*="tablet-col-7-6"] { --x-grid-template-columns-col-7-size: 6fr; } + &[data-callout*="tablet-col-7-7"] { --x-grid-template-columns-col-7-size: 7fr; } + &[data-callout*="tablet-col-7-8"] { --x-grid-template-columns-col-7-size: 8fr; } + + &[data-callout*="tablet-col-8-auto"] { --x-grid-template-columns-col-8-size: auto; } + &[data-callout*="tablet-col-8-1"] { --x-grid-template-columns-col-8-size: 1fr; } + &[data-callout*="tablet-col-8-2"] { --x-grid-template-columns-col-8-size: 2fr; } + &[data-callout*="tablet-col-8-3"] { --x-grid-template-columns-col-8-size: 3fr; } + &[data-callout*="tablet-col-8-4"] { --x-grid-template-columns-col-8-size: 4fr; } + &[data-callout*="tablet-col-8-5"] { --x-grid-template-columns-col-8-size: 5fr; } + &[data-callout*="tablet-col-8-6"] { --x-grid-template-columns-col-8-size: 6fr; } + &[data-callout*="tablet-col-8-7"] { --x-grid-template-columns-col-8-size: 7fr; } + &[data-callout*="tablet-col-8-8"] { --x-grid-template-columns-col-8-size: 8fr; } + } + + /* prettier-ignore */ + @media screen and (max-width: 750px) { + &[data-callout*="mobile-col-1-auto"] { --x-grid-template-columns-col-1-size: auto; } + &[data-callout*="mobile-col-1-1"] { --x-grid-template-columns-col-1-size: 1fr; } + &[data-callout*="mobile-col-1-2"] { --x-grid-template-columns-col-1-size: 2fr; } + &[data-callout*="mobile-col-1-3"] { --x-grid-template-columns-col-1-size: 3fr; } + &[data-callout*="mobile-col-1-4"] { --x-grid-template-columns-col-1-size: 4fr; } + &[data-callout*="mobile-col-1-5"] { --x-grid-template-columns-col-1-size: 5fr; } + &[data-callout*="mobile-col-1-6"] { --x-grid-template-columns-col-1-size: 6fr; } + &[data-callout*="mobile-col-1-7"] { --x-grid-template-columns-col-1-size: 7fr; } + &[data-callout*="mobile-col-1-8"] { --x-grid-template-columns-col-1-size: 8fr; } + + &[data-callout*="mobile-col-2-auto"] { --x-grid-template-columns-col-2-size: auto; } + &[data-callout*="mobile-col-2-1"] { --x-grid-template-columns-col-2-size: 1fr; } + &[data-callout*="mobile-col-2-2"] { --x-grid-template-columns-col-2-size: 2fr; } + &[data-callout*="mobile-col-2-3"] { --x-grid-template-columns-col-2-size: 3fr; } + &[data-callout*="mobile-col-2-4"] { --x-grid-template-columns-col-2-size: 4fr; } + &[data-callout*="mobile-col-2-5"] { --x-grid-template-columns-col-2-size: 5fr; } + &[data-callout*="mobile-col-2-6"] { --x-grid-template-columns-col-2-size: 6fr; } + &[data-callout*="mobile-col-2-7"] { --x-grid-template-columns-col-2-size: 7fr; } + &[data-callout*="mobile-col-2-8"] { --x-grid-template-columns-col-2-size: 8fr; } + + &[data-callout*="mobile-col-3-auto"] { --x-grid-template-columns-col-3-size: auto; } + &[data-callout*="mobile-col-3-1"] { --x-grid-template-columns-col-3-size: 1fr; } + &[data-callout*="mobile-col-3-2"] { --x-grid-template-columns-col-3-size: 2fr; } + &[data-callout*="mobile-col-3-3"] { --x-grid-template-columns-col-3-size: 3fr; } + &[data-callout*="mobile-col-3-4"] { --x-grid-template-columns-col-3-size: 4fr; } + &[data-callout*="mobile-col-3-5"] { --x-grid-template-columns-col-3-size: 5fr; } + &[data-callout*="mobile-col-3-6"] { --x-grid-template-columns-col-3-size: 6fr; } + &[data-callout*="mobile-col-3-7"] { --x-grid-template-columns-col-3-size: 7fr; } + &[data-callout*="mobile-col-3-8"] { --x-grid-template-columns-col-3-size: 8fr; } + + &[data-callout*="mobile-col-4-auto"] { --x-grid-template-columns-col-4-size: auto; } + &[data-callout*="mobile-col-4-1"] { --x-grid-template-columns-col-4-size: 1fr; } + &[data-callout*="mobile-col-4-2"] { --x-grid-template-columns-col-4-size: 2fr; } + &[data-callout*="mobile-col-4-3"] { --x-grid-template-columns-col-4-size: 3fr; } + &[data-callout*="mobile-col-4-4"] { --x-grid-template-columns-col-4-size: 4fr; } + &[data-callout*="mobile-col-4-5"] { --x-grid-template-columns-col-4-size: 5fr; } + &[data-callout*="mobile-col-4-6"] { --x-grid-template-columns-col-4-size: 6fr; } + &[data-callout*="mobile-col-4-7"] { --x-grid-template-columns-col-4-size: 7fr; } + &[data-callout*="mobile-col-4-8"] { --x-grid-template-columns-col-4-size: 8fr; } + + &[data-callout*="mobile-col-5-auto"] { --x-grid-template-columns-col-5-size: auto; } + &[data-callout*="mobile-col-5-1"] { --x-grid-template-columns-col-5-size: 1fr; } + &[data-callout*="mobile-col-5-2"] { --x-grid-template-columns-col-5-size: 2fr; } + &[data-callout*="mobile-col-5-3"] { --x-grid-template-columns-col-5-size: 3fr; } + &[data-callout*="mobile-col-5-4"] { --x-grid-template-columns-col-5-size: 4fr; } + &[data-callout*="mobile-col-5-5"] { --x-grid-template-columns-col-5-size: 5fr; } + &[data-callout*="mobile-col-5-6"] { --x-grid-template-columns-col-5-size: 6fr; } + &[data-callout*="mobile-col-5-7"] { --x-grid-template-columns-col-5-size: 7fr; } + &[data-callout*="mobile-col-5-8"] { --x-grid-template-columns-col-5-size: 8fr; } + + &[data-callout*="mobile-col-6-auto"] { --x-grid-template-columns-col-6-size: auto; } + &[data-callout*="mobile-col-6-1"] { --x-grid-template-columns-col-6-size: 1fr; } + &[data-callout*="mobile-col-6-2"] { --x-grid-template-columns-col-6-size: 2fr; } + &[data-callout*="mobile-col-6-3"] { --x-grid-template-columns-col-6-size: 3fr; } + &[data-callout*="mobile-col-6-4"] { --x-grid-template-columns-col-6-size: 4fr; } + &[data-callout*="mobile-col-6-5"] { --x-grid-template-columns-col-6-size: 5fr; } + &[data-callout*="mobile-col-6-6"] { --x-grid-template-columns-col-6-size: 6fr; } + &[data-callout*="mobile-col-6-7"] { --x-grid-template-columns-col-6-size: 7fr; } + &[data-callout*="mobile-col-6-8"] { --x-grid-template-columns-col-6-size: 8fr; } + + &[data-callout*="mobile-col-7-auto"] { --x-grid-template-columns-col-7-size: auto; } + &[data-callout*="mobile-col-7-1"] { --x-grid-template-columns-col-7-size: 1fr; } + &[data-callout*="mobile-col-7-2"] { --x-grid-template-columns-col-7-size: 2fr; } + &[data-callout*="mobile-col-7-3"] { --x-grid-template-columns-col-7-size: 3fr; } + &[data-callout*="mobile-col-7-4"] { --x-grid-template-columns-col-7-size: 4fr; } + &[data-callout*="mobile-col-7-5"] { --x-grid-template-columns-col-7-size: 5fr; } + &[data-callout*="mobile-col-7-6"] { --x-grid-template-columns-col-7-size: 6fr; } + &[data-callout*="mobile-col-7-7"] { --x-grid-template-columns-col-7-size: 7fr; } + &[data-callout*="mobile-col-7-8"] { --x-grid-template-columns-col-7-size: 8fr; } + + &[data-callout*="mobile-col-8-auto"] { --x-grid-template-columns-col-8-size: auto; } + &[data-callout*="mobile-col-8-1"] { --x-grid-template-columns-col-8-size: 1fr; } + &[data-callout*="mobile-col-8-2"] { --x-grid-template-columns-col-8-size: 2fr; } + &[data-callout*="mobile-col-8-3"] { --x-grid-template-columns-col-8-size: 3fr; } + &[data-callout*="mobile-col-8-4"] { --x-grid-template-columns-col-8-size: 4fr; } + &[data-callout*="mobile-col-8-5"] { --x-grid-template-columns-col-8-size: 5fr; } + &[data-callout*="mobile-col-8-6"] { --x-grid-template-columns-col-8-size: 6fr; } + &[data-callout*="mobile-col-8-7"] { --x-grid-template-columns-col-8-size: 7fr; } + &[data-callout*="mobile-col-8-8"] { --x-grid-template-columns-col-8-size: 8fr; } + } + + /* Grid template columns */ + + & { + &[data-callout*="grid-1"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size); + } + &[data-callout*="grid-2"], + &[data-callout*="grid-card-2"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size); + } + &[data-callout*="grid-3"], + &[data-callout*="grid-card-3"], + &[data-callout*="grid-card"]:not([data-callout*="grid-card-2"]) { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size); + } + &[data-callout*="grid-4"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size); + } + &[data-callout*="grid-5"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size) + var(--x-grid-template-columns-col-5-size); + } + &[data-callout*="grid-6"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size) + var(--x-grid-template-columns-col-5-size) + var(--x-grid-template-columns-col-6-size); + } + &[data-callout*="grid-7"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size) + var(--x-grid-template-columns-col-5-size) + var(--x-grid-template-columns-col-6-size) + var(--x-grid-template-columns-col-7-size); + } + &[data-callout*="grid-8"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size) + var(--x-grid-template-columns-col-5-size) + var(--x-grid-template-columns-col-6-size) + var(--x-grid-template-columns-col-7-size) + var(--x-grid-template-columns-col-8-size); + } + + @media screen and (min-width: 750px) and (max-width: 1000px) { + &[data-callout*="grid-tablet-1"], + &[data-callout*="grid-card-2"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size); + } + &[data-callout*="grid-tablet-2"], + &[data-callout*="grid-card-3"], + &[data-callout*="grid-card"]:not([data-callout*="grid-card-2"]) { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size); + } + &[data-callout*="grid-tablet-3"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size); + } + &[data-callout*="grid-tablet-4"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size); + } + &[data-callout*="grid-tablet-5"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size) + var(--x-grid-template-columns-col-5-size); + } + &[data-callout*="grid-tablet-6"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size) + var(--x-grid-template-columns-col-5-size) + var(--x-grid-template-columns-col-6-size); + } + &[data-callout*="grid-tablet-7"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size) + var(--x-grid-template-columns-col-5-size) + var(--x-grid-template-columns-col-6-size) + var(--x-grid-template-columns-col-7-size); + } + &[data-callout*="grid-tablet-8"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size) + var(--x-grid-template-columns-col-5-size) + var(--x-grid-template-columns-col-6-size) + var(--x-grid-template-columns-col-7-size) + var(--x-grid-template-columns-col-8-size); + } + } + + @media screen and (max-width: 750px) { + &[data-callout*="grid-mobile-1"], + &[data-callout*="grid-card-2"], + &[data-callout*="grid-card-3"], + &[data-callout*="grid-card"]:not([data-callout*="grid-card-2"]) { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size); + } + &[data-callout*="grid-mobile-2"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size); + } + &[data-callout*="grid-mobile-3"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size); + } + &[data-callout*="grid-mobile-4"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size); + } + &[data-callout*="grid-mobile-5"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size) + var(--x-grid-template-columns-col-5-size); + } + &[data-callout*="grid-mobile-6"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size) + var(--x-grid-template-columns-col-5-size) + var(--x-grid-template-columns-col-6-size); + } + &[data-callout*="grid-mobile-7"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size) + var(--x-grid-template-columns-col-5-size) + var(--x-grid-template-columns-col-6-size) + var(--x-grid-template-columns-col-7-size); + } + &[data-callout*="grid-mobile-8"] { + --x-grid-template-columns: var(--x-grid-template-columns-col-1-size) + var(--x-grid-template-columns-col-2-size) + var(--x-grid-template-columns-col-3-size) + var(--x-grid-template-columns-col-4-size) + var(--x-grid-template-columns-col-5-size) + var(--x-grid-template-columns-col-6-size) + var(--x-grid-template-columns-col-7-size) + var(--x-grid-template-columns-col-8-size); + } + } + } + + /* grid-auto : auto number of columns */ + + &[data-callout*="grid-auto"] { + & > .callout-content, + & > .callout-content > ul { + display: flex; + flex-direction: row; + flex-wrap: wrap; + } + } + + /* Padding */ + + & > .callout-content > ul > li { + /* Default padding top for grid with li as grid items */ + padding: var(--x-grid-padding) 0; + } + + &:is([data-callout*="padding"], [data-callout*="card"]) { + /* Padding for nested callout except nested grids */ + + & + > .callout-content + > .callout:is([data-callout*="grid-item"], :not([data-callout*="grid"])) { + & { + padding: 0; + } + + & > .callout-title { + padding: var(--x-grid-padding, var(--p-spacing)); + padding-bottom: 0; + } + + & > .callout-content { + padding: 0 var(--x-grid-padding, var(--p-spacing)); + } + } + + /* Padding + Grid with li as grid items : add padding-top for li with text */ + + & > .callout-content > ul > li { + padding: var(--x-grid-padding) var(--x-grid-padding, var(--p-spacing)); + } + } + + /* Background color */ + + &:is([data-callout*="bg"], [data-callout*="card"]) { + & + > .callout-content + > .callout[data-callout*="grid-item"] + > .callout-content, + & > .callout-content > ul > li { + background-color: var(--x-grid-bg-color); + } + } + + /* Border */ + + &:is([data-callout*="border"], [data-callout*="card"]) { + & + > .callout-content + > .callout[data-callout*="grid-item"] + > .callout-content, + & > .callout-content > ul > li { + border-radius: var(--x-grid-border-radius, 0); + border: var(--x-grid-border-width) solid var(--x-grid-border-color); + } + } + + /* Gap */ + + &:is([data-callout*="gap"], [data-callout*="card"]) { + & > .callout-content, + & > .callout-content > ul { + grid-gap: var(--x-grid-gap); + } + } + + /* Same height */ + + &:is([data-callout*="same-height"], [data-callout*="card"]) { + & > .callout-content > .callout > .callout-content { + /* Takes parent size */ + height: 100%; + width: 100%; + } + } + + /* Same height in all rows */ + + &[data-callout*="same-height-all"] { + & > .callout-content, + & > .callout-content > ul { + grid-auto-rows: 1fr; + } + } + + /* Center */ + + &[data-callout*="center"] { + & > .callout-content > .callout > .callout-content, + & > .callout-content ul > li { + text-align: center; + margin-inline-start: unset; + margin-inline-end: unset; + } + + & + > .callout-content + > .callout + > .callout-content + > :is(.callout, pre, [class*="block-language"]), + & + > .callout-content + > ul + > li + > ul + > :is(.callout, pre, [class*="block-language"]) { + /* Don't align text center inside nested callouts / code blocks */ + text-align: left; + } + + & > .callout-content > .callout > .callout-content > :is(ul, ol), + & + > .callout-content + > ul + > li + > ul + > :is(.callout, pre, [class*="block-language"]) { + /* Center lists */ + display: table; + margin-right: auto; + margin-left: auto; + } + } + + /* Right */ + + &[data-callout*="right"] { + & > .callout-content > .callout > .callout-content, + & > .callout-content ul > li { + text-align: right; + margin-inline-start: unset; + margin-inline-end: unset; + } + + & + > .callout-content + > .callout + > .callout-content + > :is(.callout, pre, [class*="block-language"]), + & + > .callout-content + > ul + > li + > ul + > :is(.callout, pre, [class*="block-language"]) { + /* Don't align text right inside nested callouts / code blocks */ + text-align: left; + } + + & > .callout-content > .callout > .callout-content > :is(ul, ol), + & > .callout-content > ul > li > ul > :is(ul, ol) { + /* Align right lists */ + display: table; + margin-left: auto; + } + } + + /* Middle : vertical align */ + + &[data-callout*="middle"] { + & > .callout-content > .callout > .callout-content, + & > .callout-content ul > li { + display: flex; + flex-direction: column; + justify-content: center; + } + } + + /* Bottom : vertical align */ + + &[data-callout*="bottom"] { + & > .callout-content > .callout > .callout-content, + & > .callout-content ul > li { + display: flex; + flex-direction: column; + justify-content: end; + } + } + + /* Top : vertical align */ + + &[data-callout*="top"] { + & > .callout-content > .callout > .callout-content, + & > .callout-content ul > li { + display: flex; + flex-direction: column; + justify-content: start; + } + } + + /* Hide PC / Tablet / Mobile */ + + & { + @media screen and (min-width: 1000px) { + &:is( + [data-callout*="hide-on-pc"], + [data-callout*="tablet-only"], + [data-callout*="mobile-only"] + ) { + display: none; + } + } + + @media screen and (min-width: 750px) and (max-width: 1000px) { + &:is( + [data-callout*="hide-on-tablet"], + [data-callout*="pc-only"], + [data-callout*="mobile-only"] + ) { + display: none; + } + } + + @media screen and (max-width: 750px) { + &:is( + [data-callout*="hide-on-mobile"], + [data-callout*="tablet-only"], + [data-callout*="pc-only"] + ) { + display: none; + } + } + } +} diff --git a/package-lock.json b/package-lock.json index fdff1fb8f1..8a1ea56a31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "": { "name": "web", "version": "1.0.0", - "license": "ISC", + "license": "MIT", "dependencies": { "@11ty/eleventy-img": "^4.0.2", "@sindresorhus/slugify": "^1.1.0", @@ -18,6 +18,7 @@ "fs-file-tree": "^1.1.1", "glob": "^10.2.1", "gray-matter": "^4.0.3", + "jsep": "^1.4.0", "markdown-it": "^14.1.0", "markdown-it-anchor": "^9.0.1", "markdown-it-attrs": "^4.1.6", @@ -27,73 +28,91 @@ "markdown-it-plantuml": "^1.4.1", "markdown-it-task-checkbox": "^1.0.6", "npm-run-all": "^4.1.5", - "rimraf": "^4.4.1" + "rimraf": "^4.4.1", + "yaml": "^2.8.3" }, "devDependencies": { - "@11ty/eleventy": "^2.0.1", - "@11ty/eleventy-plugin-rss": "^1.2.0", - "cross-env": "^7.0.3", + "@11ty/eleventy": "^3.1.2", + "@11ty/eleventy-plugin-rss": "^2.0.4", + "cross-env": "^10.1.0", "html-minifier-terser": "^7.2.0", - "node-html-parser": "^6.1.13", - "sass": "^1.49.9" + "node-html-parser": "^7.0.2", + "sass": "^1.49.9", + "vitest": "^4.1.0" + }, + "engines": { + "node": "22.x" } }, "node_modules/@11ty/dependency-tree": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-2.0.1.tgz", - "integrity": "sha512-5R+DsT9LJ9tXiSQ4y+KLFppCkQyXhzAm1AIuBWE/sbU0hSXY5pkhoqQYEcPJQFg/nglL+wD55iv2j+7O96UAvg==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-4.0.0.tgz", + "integrity": "sha512-PTOnwM8Xt+GdJmwRKg4pZ8EKAgGoK7pedZBfNSOChXu8MYk2FdEsxdJYecX4t62owpGw3xK60q9TQv/5JI59jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.1" + } + }, + "node_modules/@11ty/dependency-tree-esm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree-esm/-/dependency-tree-esm-2.0.2.tgz", + "integrity": "sha512-kSTmXneksQLBhwsfqjxiSi9ecRKENXmRtT5RG95rFoWSI8kkwLcGlYpoXsPkCD9uQwSU1rmDzXBDnqUJlWaIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.7", + "acorn": "^8.15.0", + "dependency-graph": "^1.0.0", + "normalize-path": "^3.0.0" + } }, "node_modules/@11ty/eleventy": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-2.0.1.tgz", - "integrity": "sha512-t8XVUbCJByhVEa1RzO0zS2QzbL3wPY8ot1yUw9noqiSHxJWUwv6jiwm1/MZDPTYtkZH2ZHvdQIRQ5/SjG9XmLw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-3.1.2.tgz", + "integrity": "sha512-IcsDlbXnBf8cHzbM1YBv3JcTyLB35EK88QexmVyFdVJVgUU6bh9g687rpxryJirHzo06PuwnYaEEdVZQfIgRGg==", "dev": true, + "license": "MIT", "dependencies": { - "@11ty/dependency-tree": "^2.0.1", - "@11ty/eleventy-dev-server": "^1.0.4", - "@11ty/eleventy-utils": "^1.0.1", + "@11ty/dependency-tree": "^4.0.0", + "@11ty/dependency-tree-esm": "^2.0.0", + "@11ty/eleventy-dev-server": "^2.0.8", + "@11ty/eleventy-plugin-bundle": "^3.0.6", + "@11ty/eleventy-utils": "^2.0.7", "@11ty/lodash-custom": "^4.17.21", - "@iarna/toml": "^2.2.5", - "@sindresorhus/slugify": "^1.1.2", - "bcp-47-normalize": "^1.1.1", - "chokidar": "^3.5.3", - "cross-spawn": "^7.0.3", - "debug": "^4.3.4", - "dependency-graph": "^0.11.0", - "ejs": "^3.1.9", - "fast-glob": "^3.2.12", - "graceful-fs": "^4.2.11", + "@11ty/posthtml-urls": "^1.0.1", + "@11ty/recursive-copy": "^4.0.2", + "@sindresorhus/slugify": "^2.2.1", + "bcp-47-normalize": "^2.3.0", + "chokidar": "^3.6.0", + "debug": "^4.4.1", + "dependency-graph": "^1.0.0", + "entities": "^6.0.1", + "filesize": "^10.1.6", "gray-matter": "^4.0.3", - "hamljs": "^0.6.2", - "handlebars": "^4.7.7", - "is-glob": "^4.0.3", - "iso-639-1": "^2.1.15", + "iso-639-1": "^3.1.5", + "js-yaml": "^4.1.0", "kleur": "^4.1.5", - "liquidjs": "^10.7.0", - "luxon": "^3.3.0", - "markdown-it": "^13.0.1", - "micromatch": "^4.0.5", + "liquidjs": "^10.21.1", + "luxon": "^3.6.1", + "markdown-it": "^14.1.0", "minimist": "^1.2.8", "moo": "^0.5.2", - "multimatch": "^5.0.0", - "mustache": "^4.2.0", - "normalize-path": "^3.0.0", - "nunjucks": "^3.2.3", - "path-to-regexp": "^6.2.1", + "node-retrieve-globals": "^6.0.1", + "nunjucks": "^3.2.4", + "picomatch": "^4.0.2", "please-upgrade-node": "^3.2.0", "posthtml": "^0.16.6", - "posthtml-urls": "^1.0.0", - "pug": "^3.0.2", - "recursive-copy": "^2.0.14", - "semver": "^7.3.8", - "slugify": "^1.6.6" + "posthtml-match-helper": "^2.0.3", + "semver": "^7.7.2", + "slugify": "^1.6.6", + "tinyglobby": "^0.2.14" }, "bin": { - "eleventy": "cmd.js" + "eleventy": "cmd.cjs" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { "type": "opencollective", @@ -101,28 +120,30 @@ } }, "node_modules/@11ty/eleventy-dev-server": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-dev-server/-/eleventy-dev-server-1.0.4.tgz", - "integrity": "sha512-qVBmV2G1KF/0o5B/3fITlrrDHy4bONUI2YuN3/WJ3BNw4NU1d/we8XhKrlgq13nNvHoBx5czYp3LZt8qRG53Fg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-dev-server/-/eleventy-dev-server-2.0.8.tgz", + "integrity": "sha512-15oC5M1DQlCaOMUq4limKRYmWiGecDaGwryr7fTE/oM9Ix8siqMvWi+I8VjsfrGr+iViDvWcH/TVI6D12d93mA==", "dev": true, + "license": "MIT", "dependencies": { - "@11ty/eleventy-utils": "^1.0.1", - "chokidar": "^3.5.3", - "debug": "^4.3.4", - "dev-ip": "^1.0.1", - "finalhandler": "^1.2.0", + "@11ty/eleventy-utils": "^2.0.1", + "chokidar": "^3.6.0", + "debug": "^4.4.0", + "finalhandler": "^1.3.1", "mime": "^3.0.0", "minimist": "^1.2.8", - "morphdom": "^2.7.0", + "morphdom": "^2.7.4", "please-upgrade-node": "^3.2.0", - "ssri": "^8.0.1", - "ws": "^8.13.0" + "send": "^1.1.0", + "ssri": "^11.0.0", + "urlpattern-polyfill": "^10.0.0", + "ws": "^8.18.1" }, "bin": { "eleventy-dev-server": "cmd.js" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { "type": "opencollective", @@ -168,15 +189,36 @@ "url": "https://opencollective.com/11ty" } }, + "node_modules/@11ty/eleventy-plugin-bundle": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-3.0.7.tgz", + "integrity": "sha512-QK1tRFBhQdZASnYU8GMzpTdsMMFLVAkuU0gVVILqNyp09xJJZb81kAS3AFrNrwBCsgLxTdWHJ8N64+OTTsoKkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.2", + "debug": "^4.4.0", + "posthtml-match-helper": "^2.0.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, "node_modules/@11ty/eleventy-plugin-rss": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-rss/-/eleventy-plugin-rss-1.2.0.tgz", - "integrity": "sha512-YzFnSH/5pObcFnqZ2sAQ782WmpOZHj1+xB9ydY/0j7BZ2jUNahn53VmwCB/sBRwXA/Fbwwj90q1MLo01Ru0UaQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-rss/-/eleventy-plugin-rss-2.0.4.tgz", + "integrity": "sha512-LF60sGVlxGTryQe3hTifuzrwF8R7XbrNsM2xfcDcNMSliLN4kmB+7zvoLRySRx0AQDjqhPTAeeeT0ra6/9zHUQ==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.3.4", - "posthtml": "^0.16.6", - "posthtml-urls": "1.0.0" + "@11ty/eleventy-utils": "^2.0.0", + "@11ty/posthtml-urls": "^1.0.1", + "debug": "^4.4.0", + "posthtml": "^0.16.6" }, "funding": { "type": "opencollective", @@ -184,32 +226,65 @@ } }, "node_modules/@11ty/eleventy-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-1.0.3.tgz", - "integrity": "sha512-nULO91om7vQw4Y/UBjM8i7nJ1xl+/nyK4rImZ41lFxiY2d+XUz7ChAj1CDYFjrLZeu0utAYJTZ45LlcHTkUG4g==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-2.0.7.tgz", + "integrity": "sha512-6QE+duqSQ0GY9rENXYb4iPR4AYGdrFpqnmi59tFp9VrleOl0QSh8VlBr2yd6dlhkdtj7904poZW5PvGr9cMiJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy/node_modules/@sindresorhus/slugify": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", + "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", "dev": true, + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0" + "@sindresorhus/transliterate": "^1.0.0", + "escape-string-regexp": "^5.0.0" }, "engines": { "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@11ty/eleventy/node_modules/@sindresorhus/transliterate": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz", + "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@11ty/eleventy/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/@11ty/eleventy/node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -217,42 +292,54 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/@11ty/eleventy/node_modules/linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "node_modules/@11ty/eleventy/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "dependencies": { - "uc.micro": "^1.0.1" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@11ty/eleventy/node_modules/markdown-it": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", - "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", + "node_modules/@11ty/eleventy/node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "argparse": "^2.0.1" }, "bin": { - "markdown-it": "bin/markdown-it.js" + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@11ty/eleventy/node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true - }, - "node_modules/@11ty/eleventy/node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true + "node_modules/@11ty/eleventy/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/@11ty/lodash-custom": { "version": "4.17.21", @@ -267,491 +354,434 @@ "url": "https://opencollective.com/11ty" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "node_modules/@11ty/posthtml-urls": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@11ty/posthtml-urls/-/posthtml-urls-1.0.1.tgz", + "integrity": "sha512-6EFN/yYSxC/OzYXpq4gXDyDMlX/W+2MgCvvoxf11X1z76bqkqFJ8eep5RiBWfGT5j0323a1pwpelcJJdR46MCw==", "dev": true, + "license": "MIT", + "dependencies": { + "evaluate-value": "^2.0.0", + "http-equiv-refresh": "^2.0.1", + "list-to-array": "^1.1.0", + "parse-srcset": "^1.0.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">= 6" } }, - "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "node_modules/@11ty/recursive-copy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@11ty/recursive-copy/-/recursive-copy-4.0.2.tgz", + "integrity": "sha512-174nFXxL/6KcYbLYpra+q3nDbfKxLxRTNVY1atq2M1pYYiPfHse++3IFNl8mjPFsd7y2qQjxLORzIjHMjL3NDQ==", "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "license": "ISC", + "dependencies": { + "errno": "^1.0.0", + "junk": "^3.1.0", + "maximatch": "^0.1.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", - "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" } }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "dev": true, + "license": "MIT" }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", - "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.2" + "@img/sharp-libvips-darwin-arm64": "1.0.4" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz", - "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", "cpu": [ "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.2" + "@img/sharp-libvips-darwin-x64": "1.0.4" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", - "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" ], - "engines": { - "macos": ">=11", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", - "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" ], - "engines": { - "macos": ">=10.13", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", - "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", "cpu": [ "arm" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "glibc": ">=2.28", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", - "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "glibc": ">=2.26", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz", - "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", "cpu": [ "s390x" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "glibc": ">=2.28", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", - "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "glibc": ">=2.26", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", - "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "musl": ">=1.2.2", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", - "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "musl": ">=1.2.2", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz", - "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", "cpu": [ "arm" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "glibc": ">=2.28", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.2" + "@img/sharp-libvips-linux-arm": "1.0.5" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz", - "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.2" + "@img/sharp-libvips-linux-arm64": "1.0.4" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz", - "integrity": "sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", "cpu": [ "s390x" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "glibc": ">=2.31", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.2" + "@img/sharp-libvips-linux-s390x": "1.0.4" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", - "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", "cpu": [ "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.2" + "@img/sharp-libvips-linux-x64": "1.0.4" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz", - "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "musl": ">=1.2.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz", - "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", "cpu": [ "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "musl": ">=1.2.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.2" + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz", - "integrity": "sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", "cpu": [ "wasm32" ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.1.1" + "@emnapi/runtime": "^1.2.0" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", - "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", "cpu": [ "ia32" ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz", - "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", "cpu": [ "x64" ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" @@ -816,10 +846,11 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -831,39 +862,33 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@tybys/wasm-util": "^0.10.3" }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, "node_modules/@pkgjs/parseargs": { @@ -875,29 +900,304 @@ "node": ">=14" } }, - "node_modules/@sindresorhus/slugify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.2.tgz", - "integrity": "sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA==", - "dependencies": { - "@sindresorhus/transliterate": "^0.1.1", - "escape-string-regexp": "^4.0.0" - }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@sindresorhus/transliterate": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz", - "integrity": "sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==", - "dependencies": { - "escape-string-regexp": "^2.0.0", - "lodash.deburr": "^4.1.0" - }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/slugify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.2.tgz", + "integrity": "sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA==", + "dependencies": { + "@sindresorhus/transliterate": "^0.1.1", + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/transliterate": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz", + "integrity": "sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==", + "dependencies": { + "escape-string-regexp": "^2.0.0", + "lodash.deburr": "^4.1.0" + }, "engines": { "node": ">=10" }, @@ -913,6 +1213,49 @@ "node": ">=8" } }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", @@ -935,16 +1278,118 @@ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "peer": true }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true + "node_modules/@vitest/expect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", + "integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "chai": "^6.2.2", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + "node_modules/@vitest/mocker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", + "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz", + "integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz", + "integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.0", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz", + "integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.0", + "@vitest/utils": "4.1.0", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", + "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz", + "integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.0", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, "node_modules/a-sync-waterfall": { "version": "1.0.1", @@ -953,17 +1398,43 @@ "dev": true }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" }, "engines": { "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -997,12 +1468,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", - "integrity": "sha512-lqzY9o+BbeGHRCOyxQkt/Tgvz0IZhTmQiA+LxQW8wSNpcTbj8K+0cZiSEvbpNZZP9/11Gy7dnLO3GNWUXO4d1g==", - "dev": true - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -1040,21 +1505,26 @@ } }, "node_modules/array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/array-uniq": { @@ -1062,6 +1532,7 @@ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1088,12 +1559,13 @@ } }, "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/asap": { @@ -1102,11 +1574,15 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, - "node_modules/assert-never": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.3.0.tgz", - "integrity": "sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==", - "dev": true + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } }, "node_modules/assured": { "version": "1.0.15", @@ -1117,16 +1593,11 @@ "sliced": "^1.0.1" } }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/available-typed-arrays": { "version": "1.0.7", @@ -1143,25 +1614,15 @@ } }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-walk": { - "version": "3.0.0-canary-5", - "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", - "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", - "dev": true, + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", + "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.9.6" - }, - "engines": { - "node": ">= 10.0.0" + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" } }, "node_modules/balanced-match": { @@ -1170,14 +1631,15 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bcp-47": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-1.0.8.tgz", - "integrity": "sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", "dev": true, + "license": "MIT", "dependencies": { - "is-alphabetical": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0" + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" }, "funding": { "type": "github", @@ -1185,23 +1647,25 @@ } }, "node_modules/bcp-47-match": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-1.0.3.tgz", - "integrity": "sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/bcp-47-normalize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-1.1.1.tgz", - "integrity": "sha512-jWZ1Jdu3cs0EZdfCkS0UE9Gg01PtxnChjEBySeB+Zo6nkqtFfnvtoQQgP1qU1Oo4qgJgxhTI6Sf9y/pZIhPs0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-2.3.0.tgz", + "integrity": "sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q==", "dev": true, + "license": "MIT", "dependencies": { - "bcp-47": "^1.0.0", - "bcp-47-match": "^1.0.0" + "bcp-47": "^2.0.0", + "bcp-47-match": "^2.0.0" }, "funding": { "type": "github", @@ -1235,9 +1699,10 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", + "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1289,6 +1754,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/camelo": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelo/-/camelo-1.2.1.tgz", @@ -1298,29 +1776,14 @@ "uc-first-array": "^1.1.10" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", - "dev": true, - "dependencies": { - "is-regex": "^1.0.3" + "node": ">=18" } }, "node_modules/cheerio": { @@ -1424,6 +1887,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1442,38 +1906,36 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/constantinople": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", - "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "dependencies": { - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.1" - } + "license": "MIT" }, "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.1" + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" }, "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" }, "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" + "node": ">=20" } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1558,11 +2020,12 @@ } }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1617,17 +2080,29 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6.0" + "node": ">=4" } }, "node_modules/detect-libc": { @@ -1638,24 +2113,6 @@ "node": ">=8" } }, - "node_modules/dev-ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", - "dev": true, - "bin": { - "dev-ip": "lib/dev-ip.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", - "dev": true - }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -1747,6 +2204,20 @@ "url": "https://dotenvx.com" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -1761,22 +2232,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, "node_modules/eleventy-plugin-gen-favicons": { "version": "1.1.3", @@ -1802,10 +2259,11 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1822,10 +2280,11 @@ } }, "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/errno/-/errno-1.0.0.tgz", + "integrity": "sha512-3zV5mFS1E8/1bPxt/B0xxzI1snsg3uSCIh6Zo1qKg6iMw93hzPANk9oBFzSFBFrwuVoQuE3rLoouAUfwOAj1wQ==", "dev": true, + "license": "MIT", "dependencies": { "prr": "~1.0.1" }, @@ -1901,12 +2360,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1919,10 +2376,18 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" + }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -1931,13 +2396,15 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -1974,7 +2441,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -1995,6 +2463,16 @@ "node": ">=6" } }, + "node_modules/esm-import-transformer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/esm-import-transformer/-/esm-import-transformer-3.0.5.tgz", + "integrity": "sha512-1GKLvfuMnnpI75l8c6sHoz0L3Z872xL5akGuBudgqTDPv4Vy6f2Ec7jEMKTxlqWl/3kSvNbHELeimJtnqgYniw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -2007,11 +2485,51 @@ "node": ">=4" } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/evaluate-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/evaluate-value/-/evaluate-value-2.0.0.tgz", + "integrity": "sha512-VonfiuDJc0z4sOO7W0Pd130VLsXN6vmBWZlrog1mCb/o7o/Nl5Lr25+Kj/nkCCAhG+zqeeGjxhkK9oHpkgTHhQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -2028,50 +2546,14 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=10" + "node": ">= 10.4.0" } }, "node_modules/fill-range": { @@ -2087,13 +2569,14 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -2109,6 +2592,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -2117,7 +2601,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/flat-cache": { "version": "3.2.0", @@ -2133,9 +2618,9 @@ } }, "node_modules/flat-cache/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -2164,9 +2649,9 @@ } }, "node_modules/flat-cache/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -2192,20 +2677,22 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", + "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", + "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -2239,22 +2726,36 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" } }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/fs-file-tree": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fs-file-tree/-/fs-file-tree-1.1.1.tgz", - "integrity": "sha512-v0helQXZOGxxq9rzEnmYR+Kd7uwupCiTo9PQMlsqZX6zDPoLBOertv53ttY1vAeEoe15pM9jGv9J7f/KFR/S5A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fs-file-tree/-/fs-file-tree-1.1.2.tgz", + "integrity": "sha512-NCMV5VarvMM+NFNXBL5pOZLxHlyGI2Jt/DqKP9An1DqRrYGdcGUHcF9CnOw3QlAMP7F/TydHV+KwbY6rrG2Jvw==", + "license": "MIT", "dependencies": { "assured": "^1.0.14", "bindy": "^1.0.3", @@ -2324,15 +2825,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2341,6 +2848,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-symbol-description": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", @@ -2358,9 +2878,11 @@ } }, "node_modules/glob": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.3.tgz", - "integrity": "sha512-Q38SGlYRpVtDBPSWEylRyctn7uDeTp4NQERTLiCT1FqA9JXPYWqAVmQU6qh4r/zMM5ehxTcbaO8EjhWnvEhmyg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -2372,9 +2894,6 @@ "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -2407,11 +2926,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2436,33 +2956,6 @@ "node": ">=6.0" } }, - "node_modules/hamljs": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/hamljs/-/hamljs-0.6.2.tgz", - "integrity": "sha512-/chXRp4WpL47I+HX1vCCdSbEXAljEG2FBMmgO7Am0bYsqgnEjreeWzUdX1onXqwZtcfgxbCg5WtEYYvuZ5muBg==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -2471,15 +2964,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -2503,9 +2987,10 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2528,9 +3013,10 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -2633,18 +3119,50 @@ } }, "node_modules/http-equiv-refresh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-equiv-refresh/-/http-equiv-refresh-1.0.0.tgz", - "integrity": "sha512-TScO04soylRN9i/QdOdgZyhydXg9z6XdaGzEyOgDKycePeDeTT4KvigjBcI+tgfTlieLWauGORMq5F1eIDa+1w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-equiv-refresh/-/http-equiv-refresh-2.0.1.tgz", + "integrity": "sha512-XJpDL/MLkV3dKwLzHwr2dY05dYNfBNlyPu4STQ8WvKCFdc6vC5tPXuq28of663+gHVg03C+16pHHs/+FmmDjcw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">= 6" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, "node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", "dependencies": { "queue": "6.0.2" }, @@ -2656,10 +3174,11 @@ } }, "node_modules/immutable": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", - "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", - "dev": true + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.9.tgz", + "integrity": "sha512-ObHy4YN7ycwZOUCLI1/6svfyAFu7vL8RhAvVu/bh/RZW9EPlOyDaQ9jDQWCtdqzaXUjgXZCW1migtHE7YI7UGQ==", + "dev": true, + "license": "MIT" }, "node_modules/inflight": { "version": "1.0.6", @@ -2690,23 +3209,25 @@ } }, "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", "dev": true, + "license": "MIT", "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" }, "funding": { "type": "github", @@ -2825,25 +3346,16 @@ } }, "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-expression": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", - "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "object-assign": "^4.1.1" - } - }, "node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -2921,12 +3433,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -3020,10 +3526,11 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/iso-639-1": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-2.1.15.tgz", - "integrity": "sha512-7c7mBznZu2ktfvyT582E2msM+Udc1EjOyhVRE/0ZsjD9LBtWSm23h3PtiRh2a35XoUsTQQjJXaJzuLjXsOdFDg==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-3.1.5.tgz", + "integrity": "sha512-gXkz5+KN7HrG0Q5UGqSMO2qB9AsbEeyLP54kF1YrMsIxmu+g4BdB7rflReZTSTZGpfj8wywu6pfPBCylPIzGQA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } @@ -3045,56 +3552,11 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jake": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", - "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jake/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", - "dev": true - }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", + "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -3103,6 +3565,15 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsep": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -3113,16 +3584,6 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, - "node_modules/jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", - "dev": true, - "dependencies": { - "is-promise": "^2.0.0", - "promise": "^7.0.1" - } - }, "node_modules/juice": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/juice/-/juice-8.1.0.tgz", @@ -3220,111 +3681,385 @@ "domelementtype": "^2.2.0" }, "engines": { - "node": ">= 4" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/juice/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/juice/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/juice/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/juice/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/juice/node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/juice/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/juice/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/juice/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/juice/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/juice/node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dependencies": { - "parse5": "^6.0.1" + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/junk": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz", - "integrity": "sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" } }, "node_modules/liquidjs": { - "version": "10.14.0", - "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.14.0.tgz", - "integrity": "sha512-Zjg35Yo3L/2aNy7QkICha/ulbXRtZS7oRenWyDDfw+J34Xy3fOKWWHxASC9r0gbxN661nrwmG/kOIKHfYcVk4Q==", + "version": "10.27.2", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.27.2.tgz", + "integrity": "sha512-kvknfAEtOHjHkAAv7GxLEJh8ghpMQm3Fc4uWVyF7hERSTsSRsdC7saWs0p5aDG7GDcWsu5o+T4232O+8KZO55w==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^10.0.0" }, @@ -3333,7 +4068,7 @@ "liquidjs": "bin/liquid.js" }, "engines": { - "node": ">=14" + "node": ">=16" }, "funding": { "type": "opencollective", @@ -3345,6 +4080,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } @@ -3353,7 +4089,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/list-to-array/-/list-to-array-1.1.0.tgz", "integrity": "sha512-+dAZZ2mM+/m+vY9ezfoueVvrgnHIGi5FvgSymbIgJOFwiznWyA59mav95L+Mc6xPtL3s9gm5eNTlNtxJLbNM1g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/load-json-file": { "version": "4.0.0", @@ -3383,22 +4120,44 @@ } }, "node_modules/luxon": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", - "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", + "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", + "entities": "^4.5.0", + "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" @@ -3417,9 +4176,10 @@ } }, "node_modules/markdown-it-attrs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-4.1.6.tgz", - "integrity": "sha512-O7PDKZlN8RFMyDX13JnctQompwrrILuz2y43pW2GagcwpIIElkAdfeek+erHfxUOlXWPsjFeWmZ8ch1xtRLWpA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-4.3.1.tgz", + "integrity": "sha512-/ko6cba+H6gdZ0DOw7BbNMZtfuJTRp9g/IrGIuz8lYc/EfnmWRpaR3CFPnNbVz0LDvF8Gf1hFGPqrQqq7De0rg==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -3461,6 +4221,15 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mathjax-full": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz", @@ -3477,6 +4246,7 @@ "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", "integrity": "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==", "dev": true, + "license": "MIT", "dependencies": { "array-differ": "^1.0.0", "array-union": "^1.0.1", @@ -3487,51 +4257,23 @@ "node": ">=0.10.0" } }, - "node_modules/maximatch/node_modules/array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/maximatch/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/maximatch/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/maximatch/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/maximatch/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3557,38 +4299,17 @@ "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz", "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/mhchemparser": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz", "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==" }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -3600,6 +4321,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3608,6 +4330,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -3616,11 +4339,12 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -3650,91 +4374,44 @@ "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==" }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/moo": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", "dev": true }, - "node_modules/morphdom": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.3.tgz", - "integrity": "sha512-rvGK92GxSuPEZLY8D/JH07cG3BxyA+/F0Bxg32OoGAEFFhGWA3OqVpqPZlOgZTCR52clXrmz+z2pYSJ6gOig1w==", - "dev": true - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multimatch": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", - "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", - "dev": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/multimatch/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/morphdom": { + "version": "2.7.7", + "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.7.tgz", + "integrity": "sha512-04GmsiBcalrSCNmzfo+UjU8tt3PhZJKzcOy+r1FlGA7/zri8wre3I1WkYN9PT3sIeIKfW9bpyElA+VzOg2E24g==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "license": "MIT" }, - "node_modules/multimatch/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "bin": { - "mustache": "bin/mustache" + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -3760,15 +4437,28 @@ } }, "node_modules/node-html-parser": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", - "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-7.0.2.tgz", + "integrity": "sha512-DxodLVh7a6JMkYzWyc8nBX9MaF4M0lLFYkJHlWOiu7+9/I6mwNK9u5TbAMC7qfqDJEPX9OIoWA2A9t4C2l1mUQ==", "dev": true, + "license": "MIT", "dependencies": { "css-select": "^5.1.0", "he": "1.2.0" } }, + "node_modules/node-retrieve-globals": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-6.0.1.tgz", + "integrity": "sha512-j0DeFuZ/Wg3VlklfbxUgZF/mdHMTEiEipBb3q0SpMMbHaV3AVfoUQF8UGxh1s/yjqO0TgRZd4Pi/x2yRqoQ4Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.1", + "acorn-walk": "^8.3.4", + "esm-import-transformer": "^3.0.3" + } + }, "node_modules/noop6": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.9.tgz", @@ -3838,9 +4528,10 @@ } }, "node_modules/npm-run-all/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3873,9 +4564,10 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/npm-run-all/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -3904,9 +4596,10 @@ } }, "node_modules/npm-run-all/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4016,15 +4709,6 @@ "node": ">= 6" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", @@ -4061,11 +4745,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -4136,7 +4832,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/parse5": { "version": "7.1.2", @@ -4166,6 +4863,7 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -4235,12 +4933,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true - }, "node_modules/path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -4252,6 +4944,20 @@ "node": ">=4" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -4288,6 +4994,7 @@ "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, + "license": "MIT", "dependencies": { "semver-compare": "^1.0.0" } @@ -4308,6 +5015,12 @@ "node": ">=8" } }, + "node_modules/png-to-ico/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, "node_modules/pngjs": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", @@ -4324,6 +5037,35 @@ "node": ">= 0.4" } }, + "node_modules/postcss": { + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", + "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/posthtml": { "version": "0.16.6", "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", @@ -4337,6 +5079,19 @@ "node": ">=12.0.0" } }, + "node_modules/posthtml-match-helper": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/posthtml-match-helper/-/posthtml-match-helper-2.0.3.tgz", + "integrity": "sha512-p9oJgTdMF2dyd7WE54QI1LvpBIkNkbSiiECKezNnDVYhGhD1AaOnAkw0Uh0y5TW+OHO8iBdSqnd8Wkpb6iUqmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "posthtml": "^0.16.6" + } + }, "node_modules/posthtml-parser": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", @@ -4444,173 +5199,21 @@ "node": ">=12" } }, - "node_modules/posthtml-urls": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/posthtml-urls/-/posthtml-urls-1.0.0.tgz", - "integrity": "sha512-CMJ0L009sGQVUuYM/g6WJdscsq6ooAwhUuF6CDlYPMLxKp2rmCYVebEU+wZGxnQstGJhZPMvXsRhtqekILd5/w==", - "dev": true, - "dependencies": { - "http-equiv-refresh": "^1.0.0", - "list-to-array": "^1.1.0", - "parse-srcset": "^1.0.2", - "promise-each": "^2.2.0" - }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", "engines": { - "node": ">= 4" - } - }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/promise-each": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/promise-each/-/promise-each-2.2.0.tgz", - "integrity": "sha512-67roqt1k3QDA41DZ8xi0V+rF3GoaMiX7QilbXu0vXimut+9RcKBNZ/t60xCRgcsihmNUsEjh48xLfNqOrKblUg==", - "dev": true, - "dependencies": { - "any-promise": "^0.1.0" + "node": ">=10" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, - "node_modules/pug": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", - "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", - "dev": true, - "dependencies": { - "pug-code-gen": "^3.0.3", - "pug-filters": "^4.0.0", - "pug-lexer": "^5.0.1", - "pug-linker": "^4.0.0", - "pug-load": "^3.0.0", - "pug-parser": "^6.0.0", - "pug-runtime": "^3.0.1", - "pug-strip-comments": "^2.0.0" - } - }, - "node_modules/pug-attrs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", - "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", - "dev": true, - "dependencies": { - "constantinople": "^4.0.1", - "js-stringify": "^1.0.2", - "pug-runtime": "^3.0.0" - } - }, - "node_modules/pug-code-gen": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", - "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", - "dev": true, - "dependencies": { - "constantinople": "^4.0.1", - "doctypes": "^1.1.0", - "js-stringify": "^1.0.2", - "pug-attrs": "^3.0.0", - "pug-error": "^2.1.0", - "pug-runtime": "^3.0.1", - "void-elements": "^3.1.0", - "with": "^7.0.0" - } - }, - "node_modules/pug-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", - "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", - "dev": true - }, - "node_modules/pug-filters": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", - "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", - "dev": true, - "dependencies": { - "constantinople": "^4.0.1", - "jstransformer": "1.0.0", - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0", - "resolve": "^1.15.1" - } - }, - "node_modules/pug-lexer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", - "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", - "dev": true, - "dependencies": { - "character-parser": "^2.2.0", - "is-expression": "^4.0.0", - "pug-error": "^2.0.0" - } - }, - "node_modules/pug-linker": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", - "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", - "dev": true, - "dependencies": { - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0" - } - }, - "node_modules/pug-load": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", - "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "pug-walk": "^2.0.0" - } - }, - "node_modules/pug-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", - "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", - "dev": true, - "dependencies": { - "pug-error": "^2.0.0", - "token-stream": "1.0.0" - } - }, - "node_modules/pug-runtime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", - "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", - "dev": true - }, - "node_modules/pug-strip-comments": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", - "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", "dev": true, - "dependencies": { - "pug-error": "^2.0.0" - } - }, - "node_modules/pug-walk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", - "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", - "dev": true + "license": "MIT" }, "node_modules/punycode.js": { "version": "2.3.1", @@ -4628,25 +5231,15 @@ "inherits": "~2.0.3" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/read-dir-and-stat": { "version": "1.0.8", @@ -4682,88 +5275,6 @@ "node": ">=8.10.0" } }, - "node_modules/recursive-copy": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/recursive-copy/-/recursive-copy-2.0.14.tgz", - "integrity": "sha512-K8WNY8f8naTpfbA+RaXmkaQuD1IeW9EgNEfyGxSqqTQukpVtoOKros9jUqbpEsSw59YOmpd8nCBgtqJZy5nvog==", - "dev": true, - "dependencies": { - "errno": "^0.1.2", - "graceful-fs": "^4.1.4", - "junk": "^1.0.1", - "maximatch": "^0.1.0", - "mkdirp": "^0.5.1", - "pify": "^2.3.0", - "promise": "^7.0.1", - "rimraf": "^2.7.1", - "slash": "^1.0.0" - } - }, - "node_modules/recursive-copy/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/recursive-copy/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/recursive-copy/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/recursive-copy/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/recursive-copy/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/regex-escape": { "version": "3.4.10", "resolved": "https://registry.npmjs.org/regex-escape/-/regex-escape-3.4.10.tgz", @@ -4811,16 +5322,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rimraf": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", @@ -4858,9 +5359,9 @@ } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.7.tgz", + "integrity": "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -4876,32 +5377,43 @@ "version": "4.2.8", "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "dev": true, + "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" } }, "node_modules/safe-array-concat": { @@ -4983,9 +5495,10 @@ } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4997,7 +5510,54 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/set-function-length": { "version": "1.2.2", @@ -5029,43 +5589,50 @@ "node": ">= 0.4" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, "node_modules/sharp": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz", - "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", - "semver": "^7.6.0" + "semver": "^7.6.3" }, "engines": { - "libvips": ">=8.15.2", "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.4", - "@img/sharp-darwin-x64": "0.33.4", - "@img/sharp-libvips-darwin-arm64": "1.0.2", - "@img/sharp-libvips-darwin-x64": "1.0.2", - "@img/sharp-libvips-linux-arm": "1.0.2", - "@img/sharp-libvips-linux-arm64": "1.0.2", - "@img/sharp-libvips-linux-s390x": "1.0.2", - "@img/sharp-libvips-linux-x64": "1.0.2", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", - "@img/sharp-libvips-linuxmusl-x64": "1.0.2", - "@img/sharp-linux-arm": "0.33.4", - "@img/sharp-linux-arm64": "0.33.4", - "@img/sharp-linux-s390x": "0.33.4", - "@img/sharp-linux-x64": "0.33.4", - "@img/sharp-linuxmusl-arm64": "0.33.4", - "@img/sharp-linuxmusl-x64": "0.33.4", - "@img/sharp-wasm32": "0.33.4", - "@img/sharp-win32-ia32": "0.33.4", - "@img/sharp-win32-x64": "0.33.4" + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" } }, "node_modules/shebang-command": { @@ -5088,9 +5655,13 @@ } }, "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", + "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5112,6 +5683,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -5137,12 +5715,13 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/sliced": { @@ -5177,10 +5756,11 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -5250,38 +5830,42 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-11.0.0.tgz", + "integrity": "sha512-aZpUoMN/Jj2MqA4vMCeiKGnc/8SuSyHbGSBdgFbZxP8OJGF/lFkIuElzPxsN0q8TQQ+prw3P4EDfB3TBHHgfXw==", "dev": true, + "license": "ISC", "dependencies": { - "minipass": "^3.1.1" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/ssri/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/std-env": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", + "dev": true, + "license": "MIT" + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -5449,18 +6033,6 @@ "node": ">=0.10.0" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -5490,25 +6062,79 @@ "node": ">=10" } }, - "node_modules/terser/node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": ">=0.4.0" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" } }, "node_modules/to-regex-range": { @@ -5523,11 +6149,15 @@ "node": ">=8.0" } }, - "node_modules/token-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", - "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", - "dev": true + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } }, "node_modules/tr46": { "version": "0.0.3", @@ -5627,26 +6257,14 @@ "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" }, "node_modules/ucfirst": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ucfirst/-/ucfirst-1.0.0.tgz", "integrity": "sha512-xbB/CQ0GdkxqH4IElZqenn/dL/tnyx7DCDASWJPE92ePbFM21kKemXI2LBeYtEvblf1Ol98hyJJS43Wu5JMQSQ==" }, - "node_modules/uglify-js": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", - "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -5666,10 +6284,18 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "dev": true, + "license": "MIT" + }, "node_modules/valid-data-url": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", @@ -5687,13 +6313,190 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "node_modules/vite": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", + "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==", "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.17", + "rolldown": "~1.1.5", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=0.10.0" + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", + "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.0", + "@vitest/mocker": "4.1.0", + "@vitest/pretty-format": "4.1.0", + "@vitest/runner": "4.1.0", + "@vitest/snapshot": "4.1.0", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.0", + "@vitest/browser-preview": "4.1.0", + "@vitest/browser-webdriverio": "4.1.0", + "@vitest/ui": "4.1.0", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/web-resource-inliner": { @@ -5874,31 +6677,27 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wicked-good-xpath": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", - "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==" - }, - "node_modules/with": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", - "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.9.6", - "@babel/types": "^7.9.6", - "assert-never": "^1.2.1", - "babel-walk": "3.0.0-canary-5" + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" }, "engines": { - "node": ">= 10.0.0" + "node": ">=8" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "node_modules/wicked-good-xpath": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", + "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==" }, "node_modules/wrap-ansi": { "version": "8.1.0", @@ -5987,10 +6786,11 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -6015,11 +6815,20 @@ "node": ">=0.1" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } } } } diff --git a/package.json b/package.json index 5e7cf148d9..97d576704b 100644 --- a/package.json +++ b/package.json @@ -5,24 +5,29 @@ "main": "index.js", "scripts": { "prebuild": "rimraf dist", - "start": "npm-run-all get-theme build:sass --parallel watch:*", + "dev": "npm-run-all get-theme build:sass --parallel watch:*", "watch:sass": "sass --watch src/site/styles:dist/styles", "watch:eleventy": "cross-env ELEVENTY_ENV=dev eleventy --serve", - "build:eleventy": "cross-env ELEVENTY_ENV=prod NODE_OPTIONS=--max-old-space-size=4096 eleventy", + "build:eleventy": "cross-env ELEVENTY_ENV=prod UV_THREADPOOL_SIZE=16 NODE_OPTIONS=--max-old-space-size=2048 eleventy", "build:sass": "sass src/site/styles:dist/styles --style compressed", "get-theme": "node src/site/get-theme.js", - "build": "npm-run-all get-theme build:*" + "build": "npm-run-all get-theme build:*", + "test": "vitest run" }, "keywords": [], "author": "", - "license": "ISC", + "license": "MIT", + "engines": { + "node": "22.x" + }, "devDependencies": { - "@11ty/eleventy": "^2.0.1", - "@11ty/eleventy-plugin-rss": "^1.2.0", - "cross-env": "^7.0.3", + "@11ty/eleventy": "^3.1.2", + "@11ty/eleventy-plugin-rss": "^2.0.4", + "cross-env": "^10.1.0", "html-minifier-terser": "^7.2.0", - "node-html-parser": "^6.1.13", - "sass": "^1.49.9" + "node-html-parser": "^7.0.2", + "sass": "^1.49.9", + "vitest": "^4.1.0" }, "dependencies": { "@11ty/eleventy-img": "^4.0.2", @@ -34,6 +39,7 @@ "fs-file-tree": "^1.1.1", "glob": "^10.2.1", "gray-matter": "^4.0.3", + "jsep": "^1.4.0", "markdown-it": "^14.1.0", "markdown-it-anchor": "^9.0.1", "markdown-it-attrs": "^4.1.6", @@ -43,6 +49,7 @@ "markdown-it-plantuml": "^1.4.1", "markdown-it-task-checkbox": "^1.0.6", "npm-run-all": "^4.1.5", - "rimraf": "^4.4.1" + "rimraf": "^4.4.1", + "yaml": "^2.8.3" } } diff --git a/src/helpers/bases-engine/exprEval.js b/src/helpers/bases-engine/exprEval.js new file mode 100644 index 0000000000..9f16df5569 --- /dev/null +++ b/src/helpers/bases-engine/exprEval.js @@ -0,0 +1,502 @@ +const { parseExpression } = require("./exprParser"); + +/** + * Get a user-defined property from note metadata. + * Checks "dg-note-properties" (nested/safe) first, then falls back + * to top-level metadata for backwards compatibility. + */ +function getUserProperty(metadata, key) { + if (!metadata) return undefined; + const nested = metadata["dg-note-properties"]; + if (nested && key in nested) return nested[key]; + if (key in metadata) return metadata[key]; + return undefined; +} + +/** + * Check if a user-defined property exists on the note. + */ +function hasUserProperty(metadata, key) { + if (!metadata) return false; + const nested = metadata["dg-note-properties"]; + if (nested && key in nested) return true; + return key in metadata; +} + +// Tags injected by the plugin that aren't real user tags +const SYSTEM_TAGS = new Set(["note", "gardenEntry"]); + +/** + * Resolve a property name from a note's file metadata. + */ +function resolveFileProperty(prop, note) { + if (!note.path) return undefined; + switch (prop) { + case "name": { + const parts = note.path.split("/"); + const filename = parts[parts.length - 1]; + return filename.replace(/\.[^.]+$/, ""); + } + case "path": + return note.path; + case "folder": { + const lastSlash = note.path.lastIndexOf("/"); + return lastSlash === -1 ? "" : note.path.substring(0, lastSlash); + } + case "ext": { + const dotIdx = note.path.lastIndexOf("."); + return dotIdx === -1 ? "md" : note.path.substring(dotIdx + 1); + } + case "tags": + return ((note.metadata && note.metadata.tags) || []).filter((t) => !SYSTEM_TAGS.has(t)); + case "links": + return note._links || (note.metadata && note.metadata.links) || []; + case "backlinks": + return note._backlinks || (note.metadata && note.metadata.backlinks) || []; + case "size": + case "ctime": + case "mtime": + return note.metadata ? note.metadata[prop] : undefined; + default: + return undefined; + } +} + +/** + * Resolve a file filter function call. + */ +function resolveFileMethod(method, args, note) { + switch (method) { + case "hasTag": { + const tag = args[0]; + const tags = (note.metadata && note.metadata.tags) || []; + const normalizedTag = tag.startsWith("#") ? tag.slice(1) : tag; + return tags.some( + (t) => t === normalizedTag || t === "#" + normalizedTag, + ); + } + case "inFolder": { + const folder = args[0]; + const normalised = String(folder).replace(/\/$/, ""); + return note.path.startsWith(normalised + "/"); + } + case "hasProperty": { + const prop = args[0]; + return hasUserProperty(note.metadata, prop); + } + case "hasLink": { + const link = args[0]; + const links = note._links || (note.metadata && note.metadata.links) || []; + // Check both full URL paths and stem paths + return links.some((l) => l === link || l.includes(link)); + } + default: + return undefined; + } +} + +/** + * Call a method on a resolved value (string, number, array, Date). + */ +function callMethod(obj, method, args) { + // isEmpty works on any type + if (method === "isEmpty") { + if (obj == null) return true; + if (typeof obj === "string") return obj === ""; + if (Array.isArray(obj)) return obj.length === 0; + if (obj instanceof Date) return false; + if (typeof obj === "number") return false; + return false; + } + + // String methods + if (typeof obj === "string") { + switch (method) { + case "contains": + return obj.includes(args[0]); + case "lower": + return obj.toLowerCase(); + case "upper": + return obj.toUpperCase(); + case "title": + return obj.replace( + /\b\w/g, + (c) => c.toUpperCase(), + ); + case "trim": + return obj.trim(); + case "split": + return obj.split(args[0]); + case "replace": + return obj.replace(args[0], args[1]); + case "startsWith": + return obj.startsWith(args[0]); + case "endsWith": + return obj.endsWith(args[0]); + case "slice": + return args.length > 1 + ? obj.slice(args[0], args[1]) + : obj.slice(args[0]); + } + } + + // Number methods + if (typeof obj === "number") { + switch (method) { + case "abs": + return Math.abs(obj); + case "ceil": + return Math.ceil(obj); + case "floor": + return Math.floor(obj); + case "round": { + if (args.length > 0 && args[0] != null) { + const factor = Math.pow(10, args[0]); + return Math.round(obj * factor) / factor; + } + return Math.round(obj); + } + case "toFixed": + return obj.toFixed(args[0]); + } + } + + // Array methods + if (Array.isArray(obj)) { + switch (method) { + case "contains": + return obj.includes(args[0]); + case "containsAll": + return args.every((a) => obj.includes(a)); + case "containsAny": + return args.some((a) => obj.includes(a)); + case "join": + return obj.join(args[0]); + case "sort": + return [...obj].sort(); + case "unique": + return [...new Set(obj)]; + case "flat": + return obj.flat(); + case "reverse": + return [...obj].reverse(); + case "slice": + return args.length > 1 + ? obj.slice(args[0], args[1]) + : obj.slice(args[0]); + } + } + + // Date methods + if (obj instanceof Date) { + switch (method) { + case "format": { + const fmt = args[0] || "YYYY-MM-DD"; + return fmt + .replace("YYYY", String(obj.getFullYear())) + .replace("MM", String(obj.getMonth() + 1).padStart(2, "0")) + .replace("DD", String(obj.getDate()).padStart(2, "0")) + .replace("HH", String(obj.getHours()).padStart(2, "0")) + .replace("mm", String(obj.getMinutes()).padStart(2, "0")) + .replace("ss", String(obj.getSeconds()).padStart(2, "0")); + } + // falls through not possible due to return above + case "date": + return new Date( + obj.getFullYear(), + obj.getMonth(), + obj.getDate(), + ); + case "relative": { + const now = new Date(); + const diffMs = now - obj; + const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24)); + if (diffDays === 0) return "today"; + if (diffDays === 1) return "1 day ago"; + if (diffDays > 0) return diffDays + " days ago"; + if (diffDays === -1) return "in 1 day"; + return "in " + Math.abs(diffDays) + " days"; + } + } + } + + return undefined; +} + +/** + * Resolve a property access on a value (for .length and date fields). + */ +function resolveProperty(obj, prop) { + if (prop === "length") { + if (typeof obj === "string" || Array.isArray(obj)) return obj.length; + } + + if (obj instanceof Date) { + switch (prop) { + case "year": + return obj.getFullYear(); + case "month": + return obj.getMonth() + 1; + case "day": + return obj.getDate(); + case "hour": + return obj.getHours(); + case "minute": + return obj.getMinutes(); + case "second": + return obj.getSeconds(); + } + } + + // Generic object property access + if (obj != null && typeof obj === "object" && prop in obj) { + return obj[prop]; + } + + return undefined; +} + +/** + * Evaluate a jsep AST node against a note data object. + * @param {object} ast - The jsep AST node + * @param {object} note - The note data object + * @param {object} formulas - External formulas map + * @param {object} context - Additional evaluation context + * @returns {*} The evaluated result + */ +function evalExpr(ast, note, formulas, context) { + if (!ast) return undefined; + formulas = formulas || {}; + context = context || {}; + + switch (ast.type) { + case "Literal": + return ast.value; + + case "Identifier": { + const name = ast.name; + if (name === "true") return true; + if (name === "false") return false; + if (name === "null") return null; + if (name === "undefined") return undefined; + // Look up in user properties, then metadata + return getUserProperty(note.metadata, name); + } + + case "MemberExpression": { + const prop = ast.computed + ? evalExpr(ast.property, note, formulas, context) + : ast.property.name; + + // Check if object is a special identifier + if (ast.object.type === "Identifier") { + const objName = ast.object.name; + if (objName === "file") { + return resolveFileProperty(prop, note); + } + if (objName === "note") { + return getUserProperty(note.metadata, prop); + } + if (objName === "formula") { + if (note.__formulas && note.__formulas[prop] !== undefined) { + return note.__formulas[prop]; + } + return formulas[prop]; + } + } + + // General member expression: evaluate object first + const obj = evalExpr(ast.object, note, formulas, context); + return resolveProperty(obj, prop); + } + + case "CallExpression": { + // Check for file.method() pattern + if ( + ast.callee.type === "MemberExpression" && + ast.callee.object.type === "Identifier" && + ast.callee.object.name === "file" + ) { + const method = ast.callee.property.name; + const fileMethods = [ + "hasTag", + "inFolder", + "hasProperty", + "hasLink", + ]; + if (fileMethods.includes(method)) { + const args = ast.arguments.map((a) => + evalExpr(a, note, formulas, context), + ); + return resolveFileMethod(method, args, note); + } + } + + // Check for global functions + if (ast.callee.type === "Identifier") { + const funcName = ast.callee.name; + const args = ast.arguments.map((a) => + evalExpr(a, note, formulas, context), + ); + return callGlobalFunction(funcName, args); + } + + // Method call on a value: obj.method(args) + if (ast.callee.type === "MemberExpression") { + const obj = evalExpr(ast.callee.object, note, formulas, context); + const method = ast.callee.computed + ? evalExpr(ast.callee.property, note, formulas, context) + : ast.callee.property.name; + const args = ast.arguments.map((a) => + evalExpr(a, note, formulas, context), + ); + + // Handle isEmpty on undefined/null + if (method === "isEmpty" && obj == null) return true; + + return callMethod(obj, method, args); + } + + return undefined; + } + + case "BinaryExpression": { + // Short-circuit for logical operators + if (ast.operator === "&&") { + return ( + evalExpr(ast.left, note, formulas, context) && + evalExpr(ast.right, note, formulas, context) + ); + } + if (ast.operator === "||") { + return ( + evalExpr(ast.left, note, formulas, context) || + evalExpr(ast.right, note, formulas, context) + ); + } + + const left = evalExpr(ast.left, note, formulas, context); + const right = evalExpr(ast.right, note, formulas, context); + + switch (ast.operator) { + /* eslint-disable eqeqeq */ + case "==": + return left == right; + case "!=": + return left != right; + /* eslint-enable eqeqeq */ + case ">": + return left > right; + case "<": + return left < right; + case ">=": + return left >= right; + case "<=": + return left <= right; + case "+": + return left + right; + case "-": + return left - right; + case "*": + return left * right; + case "/": + if (right === 0) return undefined; + return left / right; + case "%": + return left % right; + default: + return undefined; + } + } + + case "UnaryExpression": { + const arg = evalExpr(ast.argument, note, formulas, context); + switch (ast.operator) { + case "!": + return !arg; + case "-": + return -arg; + default: + return undefined; + } + } + + case "ConditionalExpression": { + const test = evalExpr(ast.test, note, formulas, context); + return test + ? evalExpr(ast.consequent, note, formulas, context) + : evalExpr(ast.alternate, note, formulas, context); + } + + case "ArrayExpression": { + return ast.elements.map((el) => + evalExpr(el, note, formulas, context), + ); + } + + case "Compound": { + // Evaluate all expressions, return last + let result; + for (const expr of ast.body) { + result = evalExpr(expr, note, formulas, context); + } + return result; + } + + default: + return undefined; + } +} + +/** + * Call a global function by name. + */ +function callGlobalFunction(name, args) { + switch (name) { + case "today": { + const d = new Date(); + d.setHours(0, 0, 0, 0); + d._basesType = "today"; + return d; + } + case "now": { + const d = new Date(); + d._basesType = "now"; + return d; + } + case "date": { + const d = new Date(args[0]); + return isNaN(d.getTime()) ? undefined : d; + } + case "if": + return args[0] ? args[1] : args[2]; + case "number": + return Number(args[0]); + case "min": + return Math.min(...args); + case "max": + return Math.max(...args); + case "list": + return args.length === 1 && Array.isArray(args[0]) ? args[0] : args.length === 1 ? [args[0]] : args; + default: + return undefined; + } +} + +/** + * Convenience function: parse expression string and evaluate as boolean filter. + * @param {string} expression - The expression string + * @param {object} note - The note data object + * @param {object} formulas - External formulas map + * @returns {boolean} + */ +function evalFilter(expression, note, formulas) { + try { + const ast = parseExpression(expression); + return Boolean(evalExpr(ast, note, formulas || {})); + } catch { + return false; + } +} + +module.exports = { evalExpr, evalFilter }; diff --git a/src/helpers/bases-engine/exprParser.js b/src/helpers/bases-engine/exprParser.js new file mode 100644 index 0000000000..50ddb19783 --- /dev/null +++ b/src/helpers/bases-engine/exprParser.js @@ -0,0 +1,23 @@ +const jsep = require("jsep"); + +/** + * Parse an expression string into a jsep AST. + * @param {string} expression - The expression to parse + * @returns {object} The jsep AST node + * @throws {Error} If input is empty or not a string + */ +function parseExpression(expression) { + if (typeof expression !== "string") { + throw new Error("Expression must be a string"); + } + if (expression.trim() === "") { + throw new Error("Expression must not be empty"); + } + try { + return jsep(expression); + } catch (err) { + throw new Error('Failed to parse expression "' + expression + '": ' + err.message); + } +} + +module.exports = { parseExpression }; diff --git a/src/helpers/bases-engine/imageIndex.js b/src/helpers/bases-engine/imageIndex.js new file mode 100644 index 0000000000..5663dde2e8 --- /dev/null +++ b/src/helpers/bases-engine/imageIndex.js @@ -0,0 +1,88 @@ +/** + * Index of published image files (under src/site/img/user) used to resolve + * Obsidian "shortest path" wikilinks like [[cover.jpg]] to the file's real + * location, the way Obsidian resolves them against the vault. + */ + +const fs = require("fs"); +const path = require("path"); + +/** + * Build an index over a list of image paths (relative to the image root, + * using "/" separators). + * + * resolve(linkpath) matches case-insensitively: + * - an exact relative path, or + * - any path whose trailing segments equal the linkpath ("Covers/a.jpg" + * matches "06 Assets/Covers/a.jpg" but "ter.jpg" never matches + * "Water.jpg"). + * When several files match, the shortest path wins (ties broken + * alphabetically). Returns the indexed path in its real casing, or null. + */ +function createImageIndex(paths) { + const byBasename = new Map(); + + for (const p of paths) { + const basename = p.split("/").pop().toLowerCase(); + if (!byBasename.has(basename)) byBasename.set(basename, []); + byBasename.get(basename).push(p); + } + + return { + resolve(linkpath) { + const normalized = linkpath.toLowerCase(); + const basename = normalized.split("/").pop(); + const candidates = byBasename.get(basename); + if (!candidates) return null; + + const matches = candidates.filter((p) => { + const lower = p.toLowerCase(); + + return ( + lower === normalized || lower.endsWith("/" + normalized) + ); + }); + if (matches.length === 0) return null; + + matches.sort( + (a, b) => a.length - b.length || a.localeCompare(b), + ); + + return matches[0]; + }, + }; +} + +/** + * Recursively list all files under rootDir as "/"-separated paths relative + * to rootDir. Returns [] when the directory does not exist. + */ +function scanImageDir(rootDir) { + const results = []; + + const walk = (dir, prefix) => { + let entries; + + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + return; + } + + for (const entry of entries) { + const rel = prefix ? prefix + "/" + entry.name : entry.name; + + if (entry.isDirectory()) { + walk(path.join(dir, entry.name), rel); + } else if (entry.isFile()) { + results.push(rel); + } + } + }; + + walk(rootDir, ""); + + return results; +} + +module.exports = { createImageIndex, scanImageDir }; diff --git a/src/helpers/bases-engine/index.js b/src/helpers/bases-engine/index.js new file mode 100644 index 0000000000..76ee5f8bcf --- /dev/null +++ b/src/helpers/bases-engine/index.js @@ -0,0 +1,6 @@ +const { parseExpression } = require("./exprParser"); +const { evalExpr, evalFilter } = require("./exprEval"); +const { executeBaseQuery } = require("./queryEngine"); +const { renderViews } = require("./views"); + +module.exports = { parseExpression, evalExpr, evalFilter, executeBaseQuery, renderViews }; diff --git a/src/helpers/bases-engine/noteLinks.js b/src/helpers/bases-engine/noteLinks.js new file mode 100644 index 0000000000..00dfc4d1e3 --- /dev/null +++ b/src/helpers/bases-engine/noteLinks.js @@ -0,0 +1,104 @@ +/** + * Wikilink parsing and note-target resolution for the bases engine. + * Values published by plugin >= 2.81 carry full vault paths (exact + * match); older publishes carry Obsidian "shortest path" names, resolved + * by suffix matching against the published notes. + */ + +// Index cached per notes array — the same array is reused across every +// base block in a build. +const indexCache = new WeakMap(); + +function parseWikilink(value) { + if (typeof value !== "string") return null; + const match = value.trim().match(/^!?\[\[([^\]]+)\]\]$/); + if (!match) return null; + + let inner = match[1]; + let alias = null; + const pipe = inner.indexOf("|"); + if (pipe !== -1) { + alias = inner.slice(pipe + 1).trim() || null; + inner = inner.slice(0, pipe).replace(/\\$/, ""); + } + + let heading = null; + const hash = inner.indexOf("#"); + if (hash !== -1) { + heading = inner.slice(hash + 1).trim() || null; + inner = inner.slice(0, hash); + } + + return { target: inner.trim(), heading, alias }; +} + +function noteTitle(note) { + const fromMeta = + note.metadata && + (note.metadata.title || + (note.metadata["dg-note-properties"] && + note.metadata["dg-note-properties"].title)); + if (fromMeta) return String(fromMeta); + return note.path.split("/").pop().replace(/\.md$/i, ""); +} + +function createNoteIndex(notes) { + const list = Array.isArray(notes) ? notes : []; + if (indexCache.has(list)) return indexCache.get(list); + + const exact = new Map(); + const byBasename = new Map(); + + for (const note of list) { + if (!note || !note.path || !note.url) continue; + const entry = { url: note.url, title: noteTitle(note), path: note.path }; + const lower = note.path.toLowerCase(); + const lowerNoExt = lower.replace(/\.md$/, ""); + exact.set(lower, entry); + exact.set(lowerNoExt, entry); + + const basename = lowerNoExt.split("/").pop(); + if (!byBasename.has(basename)) byBasename.set(basename, []); + byBasename.get(basename).push(entry); + } + + const index = { + resolve(target) { + const normalized = String(target) + .toLowerCase() + .replace(/\.md$/i, ""); + const exactHit = exact.get(normalized); + if (exactHit) return exactHit; + + const candidates = byBasename.get(normalized.split("/").pop()); + if (!candidates) return null; + + const matches = candidates.filter((entry) => { + const p = entry.path.toLowerCase().replace(/\.md$/, ""); + return p === normalized || p.endsWith("/" + normalized); + }); + if (matches.length === 0) return null; + + matches.sort( + (a, b) => + a.path.length - b.path.length || + a.path.localeCompare(b.path), + ); + return matches[0]; + }, + }; + + indexCache.set(list, index); + return index; +} + +function wikilinkDisplayTitle(value, index) { + const link = parseWikilink(value); + if (!link) return null; + if (link.alias) return link.alias; + const resolved = index ? index.resolve(link.target) : null; + if (resolved) return resolved.title; + return link.target.split("/").pop(); +} + +module.exports = { parseWikilink, createNoteIndex, wikilinkDisplayTitle }; diff --git a/src/helpers/bases-engine/queryEngine.js b/src/helpers/bases-engine/queryEngine.js new file mode 100644 index 0000000000..1d5f364588 --- /dev/null +++ b/src/helpers/bases-engine/queryEngine.js @@ -0,0 +1,409 @@ +const yaml = require("yaml"); +const { parseExpression } = require("./exprParser"); +const { evalExpr, evalFilter } = require("./exprEval"); + +/** + * Get a user property from metadata, checking "dg-note-properties" first. + */ +function getUserProperty(metadata, key) { + if (!metadata) return undefined; + const nested = metadata["dg-note-properties"]; + if (nested && key in nested) return nested[key]; + if (key in metadata) return metadata[key]; + return undefined; +} + +/** + * Execute a base query against an array of notes. + * @param {string} yamlContent - YAML query string + * @param {Array} notes - Array of note objects + * @returns {object} Structured result with properties and views + */ +function executeBaseQuery(yamlContent, notes) { + let parsed; + try { + parsed = yaml.parse(yamlContent.replace(/\\\|/g, "|")); + } catch (err) { + throw new Error("Failed to parse YAML: " + err.message); + } + + if (!parsed || !Array.isArray(parsed.views) || parsed.views.length === 0) { + throw new Error("Query must contain a 'views' array with at least one view"); + } + + const globalFilters = parsed.filters || null; + const formulas = parsed.formulas || {}; + const properties = parsed.properties || {}; + const globalSummaries = parsed.summaries || {}; + + const views = parsed.views.map((viewDef) => { + return processView(viewDef, notes, globalFilters, formulas, globalSummaries); + }); + + return { properties, views }; +} + +/** + * Process a single view definition. + */ +function processView(viewDef, notes, globalFilters, formulas, globalSummaries) { + const config = { + type: viewDef.type || "table", + name: viewDef.name || "Untitled", + limit: viewDef.limit != null ? viewDef.limit : null, + groupBy: viewDef.groupBy || null, + order: viewDef.order || null, + sort: viewDef.sort || null, + summaries: viewDef.summaries || null, + // Cards-specific options + image: viewDef.image || null, + imageFit: viewDef.imageFit || null, + imageAspectRatio: viewDef.imageAspectRatio || null, + cardSize: viewDef.cardSize || null, + // Table-specific options + rowHeight: viewDef.rowHeight || null, + }; + + // 1. Compute formulas + // Parse each formula expression once (not once per note) + const parsedFormulas = Object.entries(formulas).map(([key, expr]) => { + try { + return [key, parseExpression(expr)]; + } catch { + return [key, null]; + } + }); + + let rows = notes.map((note) => { + const computed = {}; + for (const [key, ast] of parsedFormulas) { + try { + computed[key] = ast ? evalExpr(ast, note, {}) : undefined; + } catch { + computed[key] = undefined; + } + } + return { ...note, __formulas: computed }; + }); + + // 2. Apply global filters + if (globalFilters) { + rows = applyFilterBlock(rows, globalFilters); + } + + // 3. Apply view-level filters + if (viewDef.filters) { + rows = applyFilterBlock(rows, viewDef.filters); + } + + // 4. Sort + rows = applySorting(rows, config); + + // 5. Group + let groups = null; + if (config.groupBy) { + groups = applyGrouping(rows, config.groupBy); + } + + // 6. Limit + if (config.limit) { + if (groups) { + groups = applyGroupLimit(groups, config.limit); + // Update rows to match grouped content + rows = groups.flatMap((g) => g.rows); + } else { + rows = rows.slice(0, config.limit); + } + } + + // 7. Compute summaries + const computedSummaries = computeSummaries(rows, config.summaries); + + return { + config, + rows, + groups, + computedSummaries, + }; +} + +// Cache parsed filter ASTs so the same expression string isn't re-parsed per note +const filterASTCache = new Map(); + +function getCachedAST(expression) { + if (filterASTCache.has(expression)) return filterASTCache.get(expression); + try { + const ast = parseExpression(expression); + filterASTCache.set(expression, ast); + return ast; + } catch { + filterASTCache.set(expression, null); + return null; + } +} + +/** + * Apply a filter block (array or object with and/or/not) to rows. + */ +function applyFilterBlock(rows, filterBlock) { + return rows.filter((note) => matchesFilter(note, filterBlock)); +} + +/** + * Check if a note matches a filter block. + * Supports: string expression, array (implicit AND), { and: [...] }, { or: [...] }, { not: [...] } + */ +function matchesFilter(note, filterBlock) { + if (typeof filterBlock === "string") { + const ast = getCachedAST(filterBlock); + if (!ast) return false; + try { + return Boolean(evalExpr(ast, note, note.__formulas || {})); + } catch { + return false; + } + } + + if (Array.isArray(filterBlock)) { + // Implicit AND + return filterBlock.every((f) => matchesFilter(note, f)); + } + + if (typeof filterBlock === "object" && filterBlock !== null) { + if (filterBlock.and) { + return filterBlock.and.every((f) => matchesFilter(note, f)); + } + if (filterBlock.or) { + return filterBlock.or.some((f) => matchesFilter(note, f)); + } + if (filterBlock.not) { + const subFilters = Array.isArray(filterBlock.not) + ? filterBlock.not + : [filterBlock.not]; + return !subFilters.some((f) => matchesFilter(note, f)); + } + } + + return true; +} + +/** + * Get a sortable value for a property path from a note. + */ +function getSortValue(note, property) { + if (property === "file.name") { + const parts = (note.path || "").split("/"); + return parts[parts.length - 1].replace(/\.[^.]+$/, ""); + } + if (property.startsWith("file.")) { + const prop = property.slice(5); + // Reuse the simple file property resolution + switch (prop) { + case "path": + return note.path || ""; + case "folder": { + const idx = (note.path || "").lastIndexOf("/"); + return idx === -1 ? "" : (note.path || "").substring(0, idx); + } + default: + return getUserProperty(note.metadata, prop); + } + } + if (property.startsWith("formula.")) { + const formulaKey = property.slice(8); + return note.__formulas ? note.__formulas[formulaKey] : undefined; + } + return getUserProperty(note.metadata, property); +} + +/** + * Apply sorting to rows based on view config. + */ +function applySorting(rows, config) { + if (config.sort && Array.isArray(config.sort) && config.sort.length > 0) { + return [...rows].sort((a, b) => { + for (const sortDef of config.sort) { + const prop = sortDef.property; + const dir = (sortDef.direction || "ASC").toUpperCase() === "DESC" ? -1 : 1; + const valA = getSortValue(a, prop); + const valB = getSortValue(b, prop); + const cmp = compareValues(valA, valB); + if (cmp !== 0) return cmp * dir; + } + return 0; + }); + } + + // Legacy order: sort by first column ASC + if (config.order && Array.isArray(config.order) && config.order.length > 0) { + const firstProp = config.order[0]; + return [...rows].sort((a, b) => { + const valA = getSortValue(a, firstProp); + const valB = getSortValue(b, firstProp); + return compareValues(valA, valB); + }); + } + + return rows; +} + +/** + * Compare two values for sorting. + */ +function compareValues(a, b) { + if (a == null && b == null) return 0; + if (a == null) return 1; + if (b == null) return -1; + if (typeof a === "string" && typeof b === "string") { + return a.localeCompare(b); + } + if (a < b) return -1; + if (a > b) return 1; + return 0; +} + +/** + * Group rows by a property, optionally sorting groups. + */ +function applyGrouping(rows, groupByDef) { + const prop = groupByDef.property; + const direction = (groupByDef.direction || "ASC").toUpperCase(); + + const groupMap = new Map(); + for (const row of rows) { + const key = getSortValue(row, prop); + const keyStr = key != null ? String(key) : "(empty)"; + if (!groupMap.has(keyStr)) { + groupMap.set(keyStr, []); + } + groupMap.get(keyStr).push(row); + } + + let groups = Array.from(groupMap.entries()).map(([key, groupRows]) => ({ + key, + rows: groupRows, + })); + + // Sort groups by key + groups.sort((a, b) => { + const cmp = compareValues(a.key, b.key); + return direction === "DESC" ? -cmp : cmp; + }); + + return groups; +} + +/** + * Apply limit to grouped rows (total row count across groups). + */ +function applyGroupLimit(groups, limit) { + let remaining = limit; + const result = []; + for (const group of groups) { + if (remaining <= 0) break; + if (group.rows.length <= remaining) { + result.push(group); + remaining -= group.rows.length; + } else { + result.push({ key: group.key, rows: group.rows.slice(0, remaining) }); + remaining = 0; + } + } + return result; +} + +/** + * Compute summary values for the given rows. + */ +function computeSummaries(rows, summaryDefs) { + if (!summaryDefs) return {}; + + const result = {}; + for (const [prop, summaryType] of Object.entries(summaryDefs)) { + const values = rows.map((r) => getSortValue(r, prop)); + result[prop] = computeSingleSummary(values, summaryType); + } + return result; +} + +/** + * Compute a single summary given an array of values and a summary type. + */ +function computeSingleSummary(values, summaryType) { + const type = typeof summaryType === "string" ? summaryType : String(summaryType); + + switch (type) { + case "Average": { + const nums = values.filter((v) => typeof v === "number" && !isNaN(v)); + if (nums.length === 0) return null; + return nums.reduce((a, b) => a + b, 0) / nums.length; + } + case "Sum": { + const nums = values.filter((v) => typeof v === "number" && !isNaN(v)); + return nums.reduce((a, b) => a + b, 0); + } + case "Min": { + const nums = values.filter((v) => typeof v === "number" && !isNaN(v)); + if (nums.length === 0) return null; + return Math.min(...nums); + } + case "Max": { + const nums = values.filter((v) => typeof v === "number" && !isNaN(v)); + if (nums.length === 0) return null; + return Math.max(...nums); + } + case "Range": { + const nums = values.filter((v) => typeof v === "number" && !isNaN(v)); + if (nums.length === 0) return null; + return Math.max(...nums) - Math.min(...nums); + } + case "Median": { + const nums = values + .filter((v) => typeof v === "number" && !isNaN(v)) + .sort((a, b) => a - b); + if (nums.length === 0) return null; + const mid = Math.floor(nums.length / 2); + return nums.length % 2 === 0 + ? (nums[mid - 1] + nums[mid]) / 2 + : nums[mid]; + } + case "Stddev": { + const nums = values.filter((v) => typeof v === "number" && !isNaN(v)); + if (nums.length === 0) return null; + const mean = nums.reduce((a, b) => a + b, 0) / nums.length; + const variance = + nums.reduce((sum, v) => sum + (v - mean) ** 2, 0) / nums.length; + return Math.sqrt(variance); + } + case "Earliest": { + const dates = values.filter((v) => v instanceof Date); + if (dates.length === 0) return null; + return new Date(Math.min(...dates.map((d) => d.getTime()))); + } + case "Latest": { + const dates = values.filter((v) => v instanceof Date); + if (dates.length === 0) return null; + return new Date(Math.max(...dates.map((d) => d.getTime()))); + } + case "Checked": + return values.filter((v) => v === true).length; + case "Unchecked": + return values.filter((v) => v === false).length; + case "Empty": + return values.filter( + (v) => v == null || v === "" || (Array.isArray(v) && v.length === 0), + ).length; + case "Filled": + return values.filter( + (v) => v != null && v !== "" && !(Array.isArray(v) && v.length === 0), + ).length; + case "Unique": + return new Set(values.filter((v) => v != null)).size; + case "Count": + return values.length; + default: + return null; + } +} + +module.exports = { executeBaseQuery }; diff --git a/src/helpers/bases-engine/views.js b/src/helpers/bases-engine/views.js new file mode 100644 index 0000000000..e21d7327a3 --- /dev/null +++ b/src/helpers/bases-engine/views.js @@ -0,0 +1,543 @@ +/** + * View renderers for bases query results. + * Generates static HTML for table, cards, and list views. + */ + +// --- Metadata helpers --- + +/** + * Get a user property from metadata. Checks "dg-note-properties" + * (nested/safe) first, then falls back to top-level metadata. + */ +function getMetaValue(metadata, key) { + if (!metadata) return undefined; + const nested = metadata["dg-note-properties"]; + if (nested && key in nested) return nested[key]; + if (key in metadata) return metadata[key]; + return undefined; +} + +/** + * Get all user-visible property keys from metadata. + */ +function getMetaKeys(metadata) { + if (!metadata) return []; + const keys = new Set(); + const nested = metadata["dg-note-properties"]; + if (nested) { + for (const key of Object.keys(nested)) keys.add(key); + } + for (const key of Object.keys(metadata)) { + if (key !== "dg-note-properties") keys.add(key); + } + return Array.from(keys); +} + +// URL-to-title lookup, populated by renderViews before rendering +let urlTitleMap = {}; + +// --- Date formatting --- + +const ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}(:\d{2})?(\.\d+)?(Z|[+-]\d{2}:\d{2})?)?$/; + +function isISODate(str) { + return ISO_DATE_REGEX.test(str); +} + +// --- Helper functions --- + +/** + * Escape HTML entities in a string. + */ +function escapeHtml(str) { + if (str == null) return ""; + return String(str) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); +} + +/** + * Internal keys to skip during column auto-detection. + */ +const INTERNAL_KEY_PATTERN = /^(tags|dg-.*|__formulas)$/; + +/** + * Determine the list of columns for a view. + * Uses config.order if available, otherwise auto-detects from row metadata. + */ +function getColumns(config, rows, properties) { + if (config.order && Array.isArray(config.order) && config.order.length > 0) { + return config.order; + } + + // Auto-detect: collect all metadata keys from rows, skip internal keys + const keySet = new Set(); + keySet.add("file.name"); + for (const row of rows) { + for (const key of getMetaKeys(row.metadata)) { + if (!INTERNAL_KEY_PATTERN.test(key)) { + keySet.add(key); + } + } + } + return Array.from(keySet); +} + +/** + * Get display name for a column. + */ +function getDisplayName(column, properties) { + if (properties && properties[column] && properties[column].displayName) { + return properties[column].displayName; + } + + if (column === "file.name") return "Name"; + + // Strip prefixes: formula.x → x, file.folder → folder + let name = column; + if (name.startsWith("formula.")) name = name.slice(8); + if (name.startsWith("file.")) name = name.slice(5); + + // Capitalize first letter + return name.charAt(0).toUpperCase() + name.slice(1); +} + +/** + * Extract the file name from a row's path. + */ +function getFileName(row) { + if (!row.path) return ""; + const parts = row.path.split("/"); + return parts[parts.length - 1].replace(/\.[^.]+$/, ""); +} + +/** + * Get a cell value from a row for a given column. + */ +function getCellValue(row, column) { + if (column === "file.name") { + return getFileName(row); + } + if (column === "file.folder") { + if (!row.path) return ""; + const lastSlash = row.path.lastIndexOf("/"); + return lastSlash === -1 ? "" : row.path.substring(0, lastSlash); + } + if (column === "file.path") { + return row.path || ""; + } + if (column === "file.ext") { + if (!row.path) return "md"; + const dotIdx = row.path.lastIndexOf("."); + return dotIdx === -1 ? "md" : row.path.substring(dotIdx + 1); + } + if (column === "file.links") { + return row._links || []; + } + if (column === "file.backlinks") { + return row._backlinks || []; + } + if (column === "file.tags") { + return (row.metadata && row.metadata.tags) || []; + } + // Handle formula.* columns + if (column.startsWith("formula.")) { + const formulaKey = column.slice(8); + if (row.__formulas && row.__formulas[formulaKey] !== undefined) { + return row.__formulas[formulaKey]; + } + return undefined; + } + // Check user properties (nested + fallback), then __formulas + const metaVal = getMetaValue(row.metadata, column); + if (metaVal !== undefined) { + return metaVal; + } + if (row.__formulas && row.__formulas[column] !== undefined) { + return row.__formulas[column]; + } + return undefined; +} + +/** + * Format a cell value for display as HTML. + */ +function formatCellValue(value, column, row) { + if (column === "file.name") { + const name = getFileName(row); + const url = row.url || ""; + return `${escapeHtml(name)}`; + } + + if (value === true) { + return ''; + } + if (value === false) { + return ''; + } + + if (Array.isArray(value)) { + return value.map((item) => { + if (typeof item === "string" && item.startsWith("/")) { + // URL path — render as clickable internal link with title + const title = urlTitleMap[item] + || urlTitleMap[item.replace(/\/$/, "") + "/"] + || null; + if (title) { + return `${escapeHtml(String(title))}`; + } + // Unresolved link — render as dead link + const slug = item.replace(/^\/|\/$/g, "").split("/").pop() || item; + return `${escapeHtml(decodeURIComponent(slug))}`; + } + if (typeof item === "string" && !item.startsWith("/") && item.includes("/")) { + // Non-URL path with slashes (e.g. raw wikilink stem like "04 - PERMANENT/Note Name") — dead link + const slug = item.split("/").pop().replace(/\.md$/, "") || item; + return `${escapeHtml(slug)}`; + } + return escapeHtml(String(item)); + }).join(", "); + } + + if (value == null) { + return ""; + } + + // Render ISO dates using the same pattern as the existing site — + // a that Luxon formats client-side using + // the user's configured TIMESTAMP_FORMAT setting. + if (typeof value === "string" && isISODate(value)) { + return ``; + } + + if (value instanceof Date && !isNaN(value.getTime())) { + // today() and now() should be evaluated client-side, not at build time + if (value._basesType === "today") { + return ''; + } + if (value._basesType === "now") { + return ''; + } + return ``; + } + + return escapeHtml(String(value)); +} + +/** + * Build a group header block for cards/list grouped views. + */ +function buildGroupHeader(group) { + return `
${escapeHtml(String(group.key || "—"))} ${group.rows.length}
`; +} + +// --- View renderers --- + +/** + * Render a table view for the given rows. + */ +function renderTable(view, properties) { + const { config, rows, groups, computedSummaries } = view; + const columns = getColumns(config, rows, properties); + + if (rows.length === 0 && (!groups || groups.length === 0)) { + return '

No results

'; + } + + if (groups) { + let html = '
'; + html += ''; + for (const col of columns) { + html += ``; + } + html += ""; + for (const group of groups) { + // Group header row spanning all columns + html += ``; + for (const row of group.rows) { + html += ""; + for (const col of columns) { + const value = getCellValue(row, col); + html += ``; + } + html += ""; + } + } + html += "
${escapeHtml(getDisplayName(col, properties))}
${escapeHtml(String(group.key || "—"))} ${group.rows.length}
${formatCellValue(value, col, row)}
"; + html += buildSummaryBar(columns, computedSummaries, config.summaries); + html += "
"; + return html; + } + + let html = '
'; + html += buildTable(columns, rows, properties); + html += buildSummaryBar(columns, computedSummaries, config.summaries); + html += "
"; + return html; +} + +function buildTable(columns, rows, properties) { + let html = ''; + for (const col of columns) { + html += ``; + } + html += ""; + + for (const row of rows) { + html += ""; + for (const col of columns) { + const value = getCellValue(row, col); + html += ``; + } + html += ""; + } + html += "
${escapeHtml(getDisplayName(col, properties))}
${formatCellValue(value, col, row)}
"; + return html; +} + +/** + * Build a summary bar that sits outside and below the table. + */ +function buildSummaryBar(columns, computedSummaries, summaryConfig) { + if (!computedSummaries || Object.keys(computedSummaries).length === 0) { + return ""; + } + + let html = '
'; + for (const col of columns) { + if (computedSummaries[col] !== undefined) { + const label = (summaryConfig && summaryConfig[col]) || ""; + const displayName = getDisplayName(col); + html += `
${escapeHtml(displayName)} ${escapeHtml(String(label))} ${escapeHtml(String(computedSummaries[col]))}
`; + } + } + html += "
"; + return html; +} + +/** + * Render a cards view. + */ +function renderCards(view, properties) { + const { config, rows, groups } = view; + const columns = getColumns(config, rows, properties); + const cardSize = config.cardSize || 200; + const imageFit = config.imageFit || "cover"; + const imageAspectRatio = config.imageAspectRatio || 1.5; + const imageField = config.image || null; + + if (rows.length === 0 && (!groups || groups.length === 0)) { + return '

No results

'; + } + + if (groups) { + let html = ""; + for (const group of groups) { + html += buildGroupHeader(group); + html += buildCardsGrid(group.rows, columns, cardSize, imageField, imageFit, imageAspectRatio, properties); + } + return html; + } + + return buildCardsGrid(rows, columns, cardSize, imageField, imageFit, imageAspectRatio, properties); +} + +function buildCardsGrid(rows, columns, cardSize, imageField, imageFit, imageAspectRatio, properties) { + let html = `
`; + + for (const row of rows) { + html += '
'; + + // Image section + if (imageField) { + let imgValue = getCellValue(row, imageField); + if (imgValue) { + imgValue = String(imgValue); + // Resolve vault image paths to published URLs + if (!imgValue.startsWith("http") && !imgValue.startsWith("/")) { + imgValue = "/img/user/" + imgValue; + } + html += `
`; + } + } + + // Content section + html += '
'; + // Title + const name = getFileName(row); + const url = row.url || ""; + html += ``; + + // Other fields (skip file.name and image field) + for (const col of columns) { + if (col === "file.name" || col === imageField) continue; + const value = getCellValue(row, col); + if (value == null) continue; + const displayName = getDisplayName(col, properties); + html += `
${escapeHtml(displayName)}: ${formatCellValue(value, col, row)}
`; + } + + html += "
"; + } + + html += "
"; + return html; +} + +/** + * Render a list view. + */ +function renderList(view, properties) { + const { config, rows, groups } = view; + const columns = getColumns(config, rows, properties); + + if (rows.length === 0 && (!groups || groups.length === 0)) { + return '

No results

'; + } + + if (groups) { + let html = ""; + for (const group of groups) { + html += buildGroupHeader(group); + html += buildList(group.rows, columns, properties); + } + return html; + } + + return buildList(rows, columns, properties); +} + +function buildList(rows, columns, properties) { + let html = '
    '; + for (const row of rows) { + const parts = []; + for (const col of columns) { + parts.push(formatCellValue(getCellValue(row, col), col, row)); + } + html += `
  • ${parts.join(" — ")}
  • `; + } + html += "
"; + return html; +} + +// --- Main export --- + +/** + * SVG icon for a view type, matching Obsidian's UI. + */ +function viewTypeIcon(type) { + switch (type) { + case "table": + return ''; + case "cards": + return ''; + case "list": + return ''; + default: + return ''; + } +} + +/** + * Render all views from a query result as HTML. + * @param {object} queryResult - Output from executeBaseQuery + * @returns {string} HTML string + */ +function renderViews(queryResult, allNotes) { + const { properties, views } = queryResult; + + // Build URL-to-title map for resolving link display names + urlTitleMap = {}; + if (allNotes) { + for (const note of allNotes) { + if (note.url) { + const title = (note.metadata && (note.metadata.title || + (note.metadata["dg-note-properties"] && note.metadata["dg-note-properties"].title))) + || note.fileSlug || note.url; + urlTitleMap[note.url] = title; + } + } + } + + if (!views || views.length === 0) { + return '

No views defined

'; + } + + const renderedPanels = views.map((view) => { + switch (view.config.type) { + case "cards": + return renderCards(view, properties); + case "list": + return renderList(view, properties); + case "table": + default: + return renderTable(view, properties); + } + }); + + // Single view — no dropdown, but show toolbar with name and count + if (views.length === 1) { + const view = views[0]; + const rowCount = view.rows ? view.rows.length : 0; + let html = '
'; + html += '
'; + html += `${viewTypeIcon(view.config.type)} ${escapeHtml(view.config.name)}`; + html += ` ${rowCount} results`; + html += '
'; + html += renderedPanels[0]; + html += '
'; + return html; + } + + // Multi-view with dropdown selector (matches Obsidian UI) + const activeView = views[0]; + const rowCount = activeView.rows ? activeView.rows.length : 0; + + let html = '
'; + + // Toolbar with dropdown + html += '
'; + html += '
'; + html += ``; + + // Dropdown menu + html += '
"; + + // Result count + html += ` ${rowCount} results`; + html += "
"; + + // View panels + for (let i = 0; i < renderedPanels.length; i++) { + const hidden = i > 0 ? ' style="display:none"' : ""; + html += `
${renderedPanels[i]}
`; + } + + html += "
"; + return html; +} + +module.exports = { + renderViews, + // Export helpers for potential reuse + escapeHtml, + getColumns, + getDisplayName, + getCellValue, + formatCellValue, +}; diff --git a/src/helpers/basesPlugin.js b/src/helpers/basesPlugin.js new file mode 100644 index 0000000000..191c336aac --- /dev/null +++ b/src/helpers/basesPlugin.js @@ -0,0 +1,72 @@ +const { executeBaseQuery, renderViews } = require("./bases-engine"); +const linkUtils = require("./linkUtils"); + +// Cache rendered HTML keyed by YAML + notes fingerprint to avoid re-rendering +// identical queries within a single build. Cleared between builds. +const renderCache = new Map(); +let renderCacheBuildId = 0; + +/** + * Clear the render cache. Call at the start of each build (e.g. --watch mode) + * to avoid serving stale HTML across rebuilds. + */ +function clearRenderCache() { + renderCache.clear(); + renderCacheBuildId++; +} + +function basesPlugin(md) { + const origFence = + md.renderer.rules.fence || + function (tokens, idx, options, env, self) { + return self.renderToken(tokens, idx, options); + }; + + md.renderer.rules.fence = (tokens, idx, options, env, self) => { + const token = tokens[idx]; + + if (token.info.trim() === "base") { + try { + // Prefer enriched notes with links/backlinks (from graph builder), + // fall back to plain notes from the data cascade + const notes = linkUtils._basesNotesWithLinks || (env && env.basesNotes) || []; + return renderBaseBlock(token.content, notes); + } catch (err) { + console.error("Error processing base query:", err); + return '
' + escapeHtml(err.message || "Unknown error") + '
'; + } + } + + return origFence(tokens, idx, options, env, self); + }; +} + +/** + * Build a fingerprint from the notes array that changes when notes are + * added, removed, or modified. Uses buildId + count + paths hash. + */ +function notesFingerprint(notes) { + let hash = 0; + for (const note of notes) { + const s = (note.url || note.fileSlug || ""); + for (let i = 0; i < s.length; i++) { + hash = ((hash << 5) - hash + s.charCodeAt(i)) | 0; + } + } + return renderCacheBuildId + ":" + notes.length + ":" + hash; +} + +function renderBaseBlock(yamlContent, notes) { + const cacheKey = yamlContent + "\0" + notesFingerprint(notes); + if (renderCache.has(cacheKey)) return renderCache.get(cacheKey); + const result = executeBaseQuery(yamlContent, notes); + const html = renderViews(result, notes); + renderCache.set(cacheKey, html); + return html; +} + +function escapeHtml(str) { + return String(str).replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); +} + +module.exports = { basesPlugin, clearRenderCache }; diff --git a/src/helpers/constants.js b/src/helpers/constants.js index e7cea580ee..8b32216f3a 100644 --- a/src/helpers/constants.js +++ b/src/helpers/constants.js @@ -1,12 +1,13 @@ -exports.ALL_NOTE_SETTINGS= [ - "dgHomeLink", - "dgPassFrontmatter", - "dgShowBacklinks", - "dgShowLocalGraph", - "dgShowInlineTitle", - "dgShowFileTree", - "dgEnableSearch", - "dgShowToc", - "dgLinkPreview", - "dgShowTags" -]; \ No newline at end of file +exports.ALL_NOTE_SETTINGS = [ + "dgHomeLink", + "dgPassFrontmatter", + "dgShowBacklinks", + "dgShowLocalGraph", + "dgShowGraphDepthControl", + "dgShowInlineTitle", + "dgShowFileTree", + "dgEnableSearch", + "dgShowToc", + "dgLinkPreview", + "dgShowTags", +]; diff --git a/src/helpers/filetreeUtils.js b/src/helpers/filetreeUtils.js index 2e3e1f2819..6350378b14 100644 --- a/src/helpers/filetreeUtils.js +++ b/src/helpers/filetreeUtils.js @@ -1,55 +1,89 @@ -const sortTree = (unsorted) => { - //Sort by folder before file, then by name - const orderedTree = Object.keys(unsorted) - .sort((a, b) => { - - let a_pinned = unsorted[a].pinned || false; - let b_pinned = unsorted[b].pinned || false; - if (a_pinned != b_pinned) { - if (a_pinned) { - return -1; - } else { - return 1; - } - } +// Natural sort comparison - handles numbers anywhere in the string +const naturalCompare = (a, b) => { + const aLower = a.toLowerCase(); + const bLower = b.toLowerCase(); - const a_is_note = a.indexOf(".md") > -1; - const b_is_note = b.indexOf(".md") > -1; + // Split into chunks of text and numbers + const aChunks = aLower.match(/(\d+|\D+)/g) || []; + const bChunks = bLower.match(/(\d+|\D+)/g) || []; - if (a_is_note && !b_is_note) { - return 1; - } + const maxLen = Math.max(aChunks.length, bChunks.length); - if (!a_is_note && b_is_note) { - return -1; - } + for (let i = 0; i < maxLen; i++) { + const aChunk = aChunks[i] || ''; + const bChunk = bChunks[i] || ''; - //Regular expression that extracts any initial decimal number - const aNum = parseFloat(a.match(/^\d+(\.\d+)?/)); - const bNum = parseFloat(b.match(/^\d+(\.\d+)?/)); + const aIsNum = /^\d+$/.test(aChunk); + const bIsNum = /^\d+$/.test(bChunk); - const a_is_num = !isNaN(aNum); - const b_is_num = !isNaN(bNum); + if (aIsNum && bIsNum) { + // Compare as numbers + const diff = parseInt(aChunk, 10) - parseInt(bChunk, 10); + if (diff !== 0) return diff; + } else { + // Compare as strings + if (aChunk < bChunk) return -1; + if (aChunk > bChunk) return 1; + } + } - if (a_is_num && b_is_num && aNum != bNum) { - return aNum - bNum; //Fast comparison between numbers - } + return 0; +}; + +const sortTree = (unsorted, navigationOrder, currentPath) => { + const orderList = navigationOrder && navigationOrder[currentPath]; - if (a.toLowerCase() > b.toLowerCase()) { - return 1; + const defaultCompare = (a, b) => { + let a_pinned = unsorted[a].pinned || false; + let b_pinned = unsorted[b].pinned || false; + if (a_pinned != b_pinned) { + return a_pinned ? -1 : 1; + } + const a_is_note = a.indexOf(".md") > -1; + const b_is_note = b.indexOf(".md") > -1; + if (a_is_note && !b_is_note) return 1; + if (!a_is_note && b_is_note) return -1; + return naturalCompare(a, b); + }; + + let orderedKeys; + + if (orderList && Array.isArray(orderList)) { + const existingKeys = new Set(Object.keys(unsorted)); + // Build a map from ordering names to actual tree keys + // The ordering uses stems (e.g. "Azure") while tree keys may have ".md" (e.g. "Azure.md") + const resolveKey = (name) => { + if (existingKeys.has(name)) return name; + if (existingKeys.has(name + ".md")) return name + ".md"; + return null; + }; + const resolvedOrdered = []; + const resolvedSet = new Set(); + for (const name of orderList) { + const key = resolveKey(name); + if (key && !resolvedSet.has(key)) { + resolvedOrdered.push(key); + resolvedSet.add(key); } + } + const unorderedKeys = Object.keys(unsorted) + .filter((k) => !resolvedSet.has(k)) + .sort(defaultCompare); - return -1; - }) - .reduce((obj, key) => { - obj[key] = unsorted[key]; + orderedKeys = [...resolvedOrdered, ...unorderedKeys]; + } else { + orderedKeys = Object.keys(unsorted).sort(defaultCompare); + } - return obj; - }, {}); + const orderedTree = orderedKeys.reduce((obj, key) => { + obj[key] = unsorted[key]; + return obj; + }, {}); for (const key of Object.keys(orderedTree)) { if (orderedTree[key].isFolder) { - orderedTree[key] = sortTree(orderedTree[key]); + const childPath = currentPath === "/" ? `/${key}` : `${currentPath}/${key}`; + orderedTree[key] = sortTree(orderedTree[key], navigationOrder, childPath); } } @@ -79,8 +113,8 @@ function getPermalinkMeta(note, key) { } // Reason for adding the hide flag instead of removing completely from file tree is to // allow users to use the filetree data elsewhere without the fear of losing any data. - if (note.data.hide) { - hide = note.data.hide; + if (note.data.hide || note.data.hideInFiletree) { + hide = true; } if (note.data.pinned) { pinned = note.data.pinned; @@ -88,11 +122,22 @@ function getPermalinkMeta(note, key) { if (note.data["dg-path"]) { folders = note.data["dg-path"].split("/"); } else { - folders = note.filePathStem - .split("notes/")[1] - .split("/"); + // Ensure we extract everything after the LAST "notes/" occurrence + const parts = note.filePathStem.split("/notes/"); + if (parts.length > 1) { + folders = parts.slice(-1)[0].split("/"); // Take the last part after "notes/" + } else { + folders = []; // Handle unexpected cases gracefully + } } - folders[folders.length - 1]+= ".md"; + // Path rewrite rules produce a dg-path that already includes the ".md" + // extension (e.g. "Path Rewriting/note.md" -> "note.md"). Strip it before + // re-appending so we don't end up with a double extension ("note.md.md"), + // which would prevent the stem-based navigation ordering from matching. + const lastFolder = folders[folders.length - 1]; + folders[folders.length - 1] = + (lastFolder.endsWith(".md") ? lastFolder.slice(0, -3) : lastFolder) + + ".md"; } catch { //ignore } @@ -101,9 +146,9 @@ function getPermalinkMeta(note, key) { } function assignNested(obj, keyPath, value) { - lastKeyIndex = keyPath.length - 1; - for (var i = 0; i < lastKeyIndex; ++i) { - key = keyPath[i]; + const lastKeyIndex = keyPath.length - 1; + for (let i = 0; i < lastKeyIndex; ++i) { + const key = keyPath[i]; if (!(key in obj)) { obj[key] = { isFolder: true }; } @@ -118,7 +163,8 @@ function getFileTree(data) { const [meta, folders] = getPermalinkMeta(note); assignNested(tree, folders, { isNote: true, ...meta }); }); - const fileTree = sortTree(tree); + const navigationOrder = data.navigationOrder || null; + const fileTree = sortTree(tree, navigationOrder, "/"); return fileTree; } diff --git a/src/helpers/imageFormat.js b/src/helpers/imageFormat.js new file mode 100644 index 0000000000..de1f2e4c16 --- /dev/null +++ b/src/helpers/imageFormat.js @@ -0,0 +1,118 @@ +const fs = require("fs"); +const { createRequire } = require("module"); + +// Use the exact sharp instance eleventy-img uses, so "can we decode this?" +// always agrees with what the optimization pipeline can actually do. +let sharp; +try { + sharp = createRequire(require.resolve("@11ty/eleventy-img"))("sharp"); +} catch { + sharp = require("sharp"); +} + +/** + * Check whether a file's actual content is an image format the sharp-based + * optimization pipeline can decode, by sniffing magic bytes. Extensions + * lie — e.g. iPhone HEIC photos renamed to .jpg — and feeding sharp an + * undecodable file fails the whole Eleventy build via an unhandled + * rejection. Unknown or unreadable files return false so the caller can + * leave the original untouched. + */ +function isTransformableImage(filePath) { + let header; + + try { + const fd = fs.openSync(filePath, "r"); + header = Buffer.alloc(16); + fs.readSync(fd, header, 0, 16, 0); + fs.closeSync(fd); + } catch { + return false; + } + + // JPEG + if (header[0] === 0xff && header[1] === 0xd8 && header[2] === 0xff) { + return true; + } + + // PNG + if (header.subarray(0, 8).equals(Buffer.from("\x89PNG\r\n\x1a\n", "latin1"))) { + return true; + } + + // GIF87a / GIF89a + const ascii = header.toString("latin1"); + if (ascii.startsWith("GIF87a") || ascii.startsWith("GIF89a")) { + return true; + } + + // WebP: RIFF....WEBP + if (ascii.startsWith("RIFF") && ascii.slice(8, 12) === "WEBP") { + return true; + } + + // TIFF (also the container some raw formats use) + if (ascii.startsWith("II*\x00") || ascii.startsWith("MM\x00*")) { + return true; + } + + // AVIF: ISO-BMFF ftyp box with an avif brand — sharp decodes these. + // Other ftyp brands (heic, heix, mif1…) are HEIC/HEIF: not decodable. + if (ascii.slice(4, 8) === "ftyp") { + return ascii.slice(8, 12) === "avif"; + } + + return false; +} + +// Probe results memoized per file version — decoding is the expensive part +// and the same image is typically referenced from many pages. +const decodableCache = new Map(); + +/** + * Check whether sharp can actually decode a file, by decoding it. + * + * Header sniffing (isTransformableImage) is a fast first filter, but a + * valid header proves nothing about the bitstream: a truncated AVIF still + * says "ftypavif" yet fails mid-decode, and eleventy-img leaves internal + * promise rejections unhandled on decode failure, which kills the whole + * Eleventy build. Only files that pass a real decode may enter the + * optimization pipeline. + */ +async function isDecodableImage(filePath) { + if (!isTransformableImage(filePath)) { + return false; + } + + let cacheKey; + + try { + const stat = fs.statSync(filePath); + cacheKey = `${filePath}:${stat.mtimeMs}:${stat.size}`; + } catch { + return false; + } + + if (decodableCache.has(cacheKey)) { + return decodableCache.get(cacheKey); + } + + const probe = sharp(filePath) + .stats() + .then( + () => true, + (err) => { + console.warn( + `[image] ${filePath} cannot be decoded and will not be optimized: ${err.message.split("\n")[0]}`, + ); + + return false; + }, + ); + + decodableCache.set(cacheKey, probe); + + return probe; +} + +module.exports = { isTransformableImage, isDecodableImage }; diff --git a/src/helpers/linkUtils.js b/src/helpers/linkUtils.js index 189de0c780..0a827f39c2 100644 --- a/src/helpers/linkUtils.js +++ b/src/helpers/linkUtils.js @@ -1,18 +1,39 @@ const wikiLinkRegex = /\[\[(.*?\|.*?)\]\]/g; const internalLinkRegex = /href="\/(.*?)"/g; +// Match iframe src for canvas embedded files (internal links only, not external URLs) +// Format: ' + tooltipWrapper.scrollTop = 0; + setTimeout(function () { + positionTooltip(elem); + tooltipWrapper.style.opacity = 1; + }, 1) + return; + } + if (/\.(png|jpg|jpeg|gif|webp|svg)$/i.test(contentURL)) { + tooltipContent.innerHTML = '' + tooltipWrapper.scrollTop = 0; + setTimeout(function () { + positionTooltip(elem); + tooltipWrapper.style.opacity = 1; + }, 1) + return; + } if (!linkHistories[contentURL]) { iframe.src = contentURL iframe.onload = function () { + let iframeWindow; + let iframeDoc; + try { + iframeWindow = iframe.contentWindow; + iframeDoc = iframeWindow ? iframeWindow.document : null; + } catch (e) { + tooltipContent.innerHTML = '
Preview not available for this file.
'; + tooltipWrapper.scrollTop = 0; + setTimeout(function () { + positionTooltip(elem); + tooltipWrapper.style.opacity = 1; + }, 1) + return; + } + if (!iframeDoc) { + return; + } + + const titleEl = iframeDoc.querySelector('h1'); + const contentEl = iframeDoc.querySelector('.content'); + tooltipContentHtml = '' - tooltipContentHtml += '
' + iframe.contentWindow.document.querySelector('h1').innerHTML + '
' - tooltipContentHtml += iframe.contentWindow.document.querySelector('.content').innerHTML + if (titleEl) { + tooltipContentHtml += '
' + titleEl.innerHTML + '
' + } + if (contentEl) { + tooltipContentHtml += contentEl.innerHTML + } else if (iframeDoc.body) { + tooltipContentHtml += iframeDoc.body.innerHTML + } else if (iframeDoc.documentElement) { + tooltipContentHtml += iframeDoc.documentElement.innerHTML + } else { + return; + } tooltipContent.innerHTML = tooltipContentHtml linkHistories[contentURL] = tooltipContentHtml - tooltipWrapper.style.display = 'block'; tooltipWrapper.scrollTop = 0; setTimeout(function () { + positionTooltip(elem); tooltipWrapper.style.opacity = 1; if (url.indexOf("#") != -1) { let id = url.split('#')[1]; @@ -92,8 +195,8 @@ } } else { tooltipContent.innerHTML = linkHistories[contentURL] - tooltipWrapper.style.display = 'block'; setTimeout(function () { + positionTooltip(elem); tooltipWrapper.style.opacity = 1; if (url.indexOf("#") != -1) { let id = url.split('#')[1]; @@ -111,19 +214,7 @@ return elem.offsetWidth - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight) - parseFloat(style.borderLeft) - parseFloat(style.borderRight) - parseFloat(style.marginLeft) - parseFloat(style.marginRight); } - tooltipWrapper.style.left = elem_props.left - (tooltipWrapper.offsetWidth / 2) + (elem_props.width / 2) + "px"; - - if ((window.innerHeight - elem_props.top) < (tooltipWrapper.offsetHeight)) { - tooltipWrapper.style.top = elem_props.top + top - tooltipWrapper.offsetHeight - 10 + "px"; - } else if ((window.innerHeight - elem_props.top) > (tooltipWrapper.offsetHeight)) { - tooltipWrapper.style.top = elem_props.top + top + 35 + "px"; - } - - if ((elem_props.left + (elem_props.width / 2)) < (tooltipWrapper.offsetWidth / 2)) { - tooltipWrapper.style.left = "10px"; - } else if ((document.body.clientWidth - elem_props.left - (elem_props.width / 2)) < (tooltipWrapper.offsetWidth / 2)) { - tooltipWrapper.style.left = document.body.clientWidth - tooltipWrapper.offsetWidth - 20 + "px"; - } + positionTooltip(elem); } } diff --git a/src/site/_includes/components/lucideIcons.njk b/src/site/_includes/components/lucideIcons.njk index 6244601805..3ca60506a9 100644 --- a/src/site/_includes/components/lucideIcons.njk +++ b/src/site/_includes/components/lucideIcons.njk @@ -1,7 +1,8 @@ - \ No newline at end of file + + diff --git a/src/site/_includes/components/navbar.njk b/src/site/_includes/components/navbar.njk index 715b2af7cc..3c7f6aa14d 100644 --- a/src/site/_includes/components/navbar.njk +++ b/src/site/_includes/components/navbar.njk @@ -2,7 +2,11 @@