feat: optimize changelog display
All checks were successful
🚀 Lint & Test & Deploy / release (push) Successful in 4m5s

- Hide releases under a Detail
- Hide all commits under a Detail
This commit is contained in:
release-bot
2026-02-08 19:04:56 +01:00
parent 979e9fd922
commit e44b73bebf
8 changed files with 438 additions and 144 deletions

View File

@@ -52,16 +52,15 @@ fi
# ------------------------------------------------------------------- # -------------------------------------------------------------------
tmp_changelog="CHANGELOG.tmp" tmp_changelog="CHANGELOG.tmp"
{ {
echo "## $TAG ($DATE)" echo "# $TAG ($DATE)"
echo "" echo ""
echo "$NOTES" echo "$NOTES"
echo "" echo ""
if [ -n "$COMMITS" ]; then if [ -n "$COMMITS" ]; then
echo "### All Commits in this version:" echo "---"
echo "$COMMITS" echo "$COMMITS"
echo "" echo ""
fi fi
echo "---"
echo "" echo ""
if [ -f CHANGELOG.md ]; then if [ -f CHANGELOG.md ]; then
cat CHANGELOG.md cat CHANGELOG.md
@@ -87,5 +86,6 @@ else
git push origin main git push origin main
fi fi
rm app/static/CHANGELOG.md
cp CHANGELOG.md app/static/CHANGELOG.md cp CHANGELOG.md app/static/CHANGELOG.md
echo "✅ Release process for $TAG complete" echo "✅ Release process for $TAG complete"

View File

@@ -1,25 +1,25 @@
## v0.0.3 (2026-02-07) # v0.0.3 (2026-02-07)
Features ## Features
- Edge dragging now highlights valid connection sockets, improving graph editing clarity. - Edge dragging now highlights valid connection sockets, improving graph editing clarity.
- InputNumber supports snapping to predefined values while holding Alt. - InputNumber supports snapping to predefined values while holding Alt.
- Changelog is accessible directly from the sidebar and now includes git metadata and a list of commits. - Changelog is accessible directly from the sidebar and now includes git metadata and a list of commits.
Fixes ## Fixes
- Fixed incorrect socket highlighting when an edge already existed. - Fixed incorrect socket highlighting when an edge already existed.
- Corrected initialization of InputNumber values outside min/max bounds. - Corrected initialization of `InputNumber` values outside min/max bounds.
- Fixed initialization of nested vec3 inputs. - Fixed initialization of nested vec3 inputs.
- Multiple CI fixes to ensure reliable builds, correct environment variables, and proper image handling. - Multiple CI fixes to ensure reliable builds, correct environment variables, and proper image handling.
Maintenance / CI ## Maintenance / CI
- Significant CI and Dockerfile cleanup and optimization. - Significant CI and Dockerfile cleanup and optimization.
- Improved git metadata generation during builds. - Improved git metadata generation during builds.
- Dependency updates, formatting, and test snapshot updates. - Dependency updates, formatting, and test snapshot updates.
### All Commits in this version ---
- [f8a2a95](https://git.max-richter.dev/max/nodarium/commit/f8a2a95bc18fa3c8c1db67dc0c2b66db1ff0d866) chore: clean CHANGELOG.md - [f8a2a95](https://git.max-richter.dev/max/nodarium/commit/f8a2a95bc18fa3c8c1db67dc0c2b66db1ff0d866) chore: clean CHANGELOG.md
- [c9dd143](https://git.max-richter.dev/max/nodarium/commit/c9dd143916d758991f3ba30723a32c18b6f98bb5) fix(ci): correctly add release notes from tag to changelog - [c9dd143](https://git.max-richter.dev/max/nodarium/commit/c9dd143916d758991f3ba30723a32c18b6f98bb5) fix(ci): correctly add release notes from tag to changelog
@@ -56,22 +56,15 @@ Maintenance / CI
- [48bf447](https://git.max-richter.dev/max/nodarium/commit/48bf447ce12949d7c29a230806d160840b7847e1) docs: straighten up changelog a bit - [48bf447](https://git.max-richter.dev/max/nodarium/commit/48bf447ce12949d7c29a230806d160840b7847e1) docs: straighten up changelog a bit
- [548fa4f](https://git.max-richter.dev/max/nodarium/commit/548fa4f0a1a14adc40a74da1182fa6da81eab3df) fix(app): correctly initialize vec3 inputs in nestedsettings - [548fa4f](https://git.max-richter.dev/max/nodarium/commit/548fa4f0a1a14adc40a74da1182fa6da81eab3df) fix(app): correctly initialize vec3 inputs in nestedsettings
--- # v0.0.2 (2026-02-04)
## v0.0.2 (2026-02-04) ## Fixes
Fixes
fix(ci): actually deploy on tags
fix(app): correctly handle false value in settings
-> This caused a bug where random seed could not be false.
--- ---
## v0.0.1 (2026-02-03) - []() fix(ci): actually deploy on tags
- []() fix(app): correctly handle false value in settings
Chore # v0.0.1 (2026-02-03)
chore: format chore: format
---

View File

@@ -26,6 +26,7 @@
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"idb": "^8.0.3", "idb": "^8.0.3",
"jsondiffpatch": "^0.7.3", "jsondiffpatch": "^0.7.3",
"micromark": "^4.0.2",
"tailwindcss": "^4.1.18", "tailwindcss": "^4.1.18",
"three": "^0.182.0" "three": "^0.182.0"
}, },

View File

@@ -1,99 +1,108 @@
<script lang="ts"> <script lang="ts">
import { Details } from '@nodarium/ui'; import { Details } from '@nodarium/ui';
import { micromark } from 'micromark';
type ReleaseBlock = { type Props = {
header: string; git?: Record<string, string>;
sections: { title: string; items: { type: string; text?: string; url?: string; linkText?: string; linkUrl?: string; message?: string; content?: string }[] }[]; changelog?: string;
commits: { type: string; linkText: string; linkUrl: string; message: string }[];
}; };
const typeMap: Record<string, string> = { const {
fix: 'bg-red-800', git,
feat: 'bg-green-800', changelog
chore: 'bg-gray-800', }: Props = $props();
docs: 'bg-blue-800',
refactor: 'bg-purple-800', const typeMap = new Map([
default: '' ['fix', 'border-l-red-800'],
['feat', 'border-l-green-800'],
['chore', 'border-l-gray-800'],
['docs', 'border-l-blue-800'],
['refactor', 'border-l-purple-800'],
['ci', 'border-l-red-400']
]);
function detectCommitType(commit: string) {
if (commit.startsWith('fix:') || commit.startsWith('fix(')) {
return 'fix';
}
if (commit.startsWith('feat:') || commit.startsWith('feat(')) {
return 'feat';
}
if (commit.startsWith('chore:') || commit.startsWith('chore(')) {
return 'chore';
}
if (commit.startsWith('docs:') || commit.startsWith('docs(')) {
return 'docs';
}
if (commit.startsWith('refactor:') || commit.startsWith('refactor(')) {
return 'refactor';
}
if (commit.startsWith('ci:') || commit.startsWith('ci(')) {
return 'ci';
}
return '';
}
function parseCommit(line?: string) {
if (!line) return;
const regex = /^\s*-\s*\[([a-f0-9]+)\]\((https?:\/\/[^\s)]+)\)\s+(.+)$/;
const match = line.match(regex);
if (!match) {
throw new Error('Invalid commit line format');
}
const [, sha, link, description] = match;
return {
sha,
link,
description,
type: detectCommitType(description)
}; };
const sectionHeaders = ['Features', 'Fixes', 'Maintenance / CI', 'Maintenance'];
async function fetchChangelog() {
const res = await fetch('/CHANGELOG.md');
return await res.text();
} }
async function fetchGitInfo() { function parseChangelog(md: string) {
const res = await fetch('/git.json'); return md.split(/^# v/gm)
return await res.json(); .filter(l => !!l.length)
} .map(release => {
const [firstLine, ...rest] = release.split('\n');
const title = firstLine.trim();
function parseChangelog(md: string): ReleaseBlock[] { const blocks = rest
const lines = md.split('\n'); .join('\n')
const releases: ReleaseBlock[] = []; .split('---');
let currentRelease: ReleaseBlock | null = null;
for (const rawLine of lines) { const commits = blocks.length > 1
const line = rawLine.trim(); ? blocks
if (!line) continue; .at(-1)
?.split('\n')
?.map(line => parseCommit(line))
?.filter(c => !!c)
: [];
if (line === '---') { const description = (
currentRelease = null; blocks.length > 1
continue; ? blocks
} .slice(0, -1)
.join('\n')
: blocks[0]
).trim();
if (line.startsWith('## ')) { return {
currentRelease = { description: micromark(description),
header: line.replace('## ', ''), title,
sections: [], commits
commits: []
}; };
releases.push(currentRelease);
continue;
}
if (!currentRelease) continue;
if (line.startsWith('### ')) {
currentRelease.commits = [];
continue;
}
const commitMatch = line.match(/^- \[([^\]]+)\]\(([^)]+)\)(.+)$/);
if (commitMatch) {
currentRelease.commits.push({
type: 'commit',
linkText: commitMatch[1],
linkUrl: commitMatch[2],
message: commitMatch[3].trim()
}); });
continue;
}
if (sectionHeaders.includes(line)) {
currentRelease.sections.push({ title: line, items: [] });
continue;
}
const lastSection = currentRelease.sections.at(-1);
if (lastSection) {
const match = line.match(/^(fix|feat|chore|docs|refactor)(\(|:)/i);
if (match) {
lastSection.items.push({ type: match[1].toLowerCase(), content: line });
} else {
lastSection.items.push({ type: 'default', content: line });
}
}
}
return releases;
} }
</script> </script>
<div class="p-4 font-mono text-text overflow-y-auto max-h-full"> <div id="changelog" class="p-4 font-mono text-text overflow-y-auto max-h-full space-y-5">
{#await Promise.all([fetchChangelog(), fetchGitInfo()])} {#if git}
<p>Loading...</p>
{:then [md, git]}
<div class="mb-4 p-3 bg-layer-2 text-xs rounded"> <div class="mb-4 p-3 bg-layer-2 text-xs rounded">
<p><strong>Branch:</strong> {git.branch}</p> <p><strong>Branch:</strong> {git.branch}</p>
<p> <p>
@@ -116,44 +125,71 @@
{new Date(git.commit_timestamp).toLocaleString()} {new Date(git.commit_timestamp).toLocaleString()}
</p> </p>
</div> </div>
{#each parseChangelog(md) as release}
<hr class="border-outline my-4" />
<h2 class="text-xl font-semibold mt-4 mb-3 text-layer-1">{release.header}</h2>
{#each release.sections as section}
<h3 class="text-base font-semibold mt-3 mb-2 text-layer-2">{section.title}</h3>
{#each section.items as item}
{#if item.type === 'default'}
<p class="py-1 leading-7">{item.content}</p>
{:else}
<p class="py-1 leading-7">
<span
class="p-1 rounded-sm opacity-80 font-semibold {typeMap[item.type] ?? 'bg-layer-2'}"
>
{item.content?.split(':')[0]}
</span>
{item.content?.split(':').slice(1).join(':').trim()}
</p>
{/if} {/if}
{/each}
{/each}
{#if release.commits.length > 0} {#if changelog}
<Details title="All Commits" transparent> {#each parseChangelog(changelog) as release (release)}
{#each release.commits as item} <Details title={release.title}>
<p class="py-1 leading-7"> <!-- eslint-disable-next-line svelte/no-at-html-tags -->
<a href={item.linkUrl} class="link" target="_blank">{item.linkText}</a> <div id="description" class="pb-5">{@html release.description}</div>
{' '}{item.message}
{#if release?.commits?.length}
<Details
title="All Commits"
class="commits"
>
{#each release.commits as commit (commit)}
<p class="py-1 leading-7 text-xs border-b-1 border-l-1 border-b-outline last:border-b-0 -ml-2 pl-2 {typeMap.get(commit.type)}">
<!-- eslint-disable-next-line svelte/no-navigation-without-resolve -->
<a href={commit.link} class="link" target="_blank">{commit.sha}</a>
{commit.description}
</p> </p>
{/each} {/each}
</Details> </Details>
{/if} {/if}
</Details>
{/each} {/each}
{/await} {/if}
</div> </div>
<style> <style>
@reference "tailwindcss";
#changelog :global(.commits) {
margin-left: -16px;
margin-right: -16px;
border-radius: 0px 0px 2px 2px !important;
}
#changelog :global(details > div){
padding-bottom: 0px;
}
#changelog :global(.commits > div) {
padding-bottom: 0px;
padding-top: 0px;
}
#description :global(h2) {
@apply font-bold mt-4 mb-1;
}
#description :global(h2:first-child) {
margin-top: 0px !important;
}
#description :global(ul) {
padding-left: 1em;
}
#description :global(li),
#description :global(p) {
@apply text-xs!;
list-style-type: disc;
}
#changelog :global(details > details[open] > summary){
margin-bottom: 20px !important;
}
.link { .link {
color: #60a5fa; color: #60a5fa;
text-decoration: none; text-decoration: none;

View File

@@ -1 +1,28 @@
export const prerender = true; export const prerender = true;
export async function load({ fetch }) {
async function fetchChangelog() {
try {
const res = await fetch('/CHANGELOG.md');
return await res.text();
} catch (error) {
console.log('Failed to fetch CHANGELOG.md', error);
return;
}
}
async function fetchGitInfo() {
try {
const res = await fetch('/git.json');
return await res.json();
} catch (error) {
console.log('Failed to fetch git.json', error);
return;
}
}
return {
git: await fetchGitInfo(),
changelog: await fetchChangelog()
};
}

View File

@@ -29,6 +29,8 @@
let performanceStore = createPerformanceStore(); let performanceStore = createPerformanceStore();
const { data } = $props();
const registryCache = new IndexDBCache('node-registry'); const registryCache = new IndexDBCache('node-registry');
const nodeRegistry = new RemoteNodeRegistry('', registryCache); const nodeRegistry = new RemoteNodeRegistry('', registryCache);
const workerRuntime = new WorkerRuntimeExecutor(); const workerRuntime = new WorkerRuntimeExecutor();
@@ -255,7 +257,7 @@
title="Changelog" title="Changelog"
icon="i-[tabler--file-text-spark] bg-green-400" icon="i-[tabler--file-text-spark] bg-green-400"
> >
<Changelog /> <Changelog git={data.git} changelog={data.changelog} />
</Panel> </Panel>
</Sidebar> </Sidebar>
</Grid.Cell> </Grid.Cell>

View File

@@ -1,31 +1,46 @@
<script lang="ts"> <script lang="ts">
import type { Snippet } from 'svelte'; import { type Snippet } from 'svelte';
interface Props { interface Props {
title?: string; title?: string;
transparent?: boolean; transparent?: boolean;
children?: Snippet; children?: Snippet;
open?: boolean; open?: boolean;
class?: string;
} }
let { title = 'Details', transparent = false, children, open = $bindable(false) }: Props = let { title = 'Details', transparent = false, children, open = $bindable(false), class: _class }:
$props(); Props = $props();
</script> </script>
<details class:transparent bind:open class="text-text outline-1 outline-outline bg-layer-1"> <details
class:transparent
bind:open
class="text-text outline-1 outline-outline bg-layer-1 {_class}"
>
<summary>{title}</summary> <summary>{title}</summary>
<div class="content"> <div>
{@render children?.()} {@render children?.()}
</div> </div>
</details> </details>
<style> <style>
details { details {
border-radius: 2px;
}
summary {
padding: 1em; padding: 1em;
padding-left: 20px; padding-left: 20px;
border-radius: 2px;
font-weight: 300; font-weight: 300;
font-size: 0.9em; font-size: 0.9em;
} }
details[open] > summary {
border-bottom: solid thin var(--color-outline);
}
details > div {
padding: 1em;
}
details.transparent { details.transparent {
background-color: transparent; background-color: transparent;
padding: 0; padding: 0;

220
pnpm-lock.yaml generated
View File

@@ -53,6 +53,9 @@ importers:
jsondiffpatch: jsondiffpatch:
specifier: ^0.7.3 specifier: ^0.7.3
version: 0.7.3 version: 0.7.3
micromark:
specifier: ^4.0.2
version: 4.0.2
tailwindcss: tailwindcss:
specifier: ^4.1.18 specifier: ^4.1.18
version: 4.1.18 version: 4.1.18
@@ -1235,6 +1238,9 @@ packages:
'@types/cookie@0.6.0': '@types/cookie@0.6.0':
resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
'@types/debug@4.1.12':
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
'@types/deep-eql@4.0.2': '@types/deep-eql@4.0.2':
resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
@@ -1250,6 +1256,9 @@ packages:
'@types/json-schema@7.0.15': '@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
'@types/node@22.8.6': '@types/node@22.8.6':
resolution: {integrity: sha512-tosuJYKrIqjQIlVCM4PEGxOmyg3FCPa/fViuJChnGeEIhjA46oy8FMVoF9su1/v8PNs2a8Q0iFNyOx0uOF91nw==} resolution: {integrity: sha512-tosuJYKrIqjQIlVCM4PEGxOmyg3FCPa/fViuJChnGeEIhjA46oy8FMVoF9su1/v8PNs2a8Q0iFNyOx0uOF91nw==}
@@ -1481,6 +1490,9 @@ packages:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'} engines: {node: '>=10'}
character-entities@2.0.2:
resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
chokidar-cli@https://codeload.github.com/open-cli-tools/chokidar-cli/tar.gz/8dd8a1e8631d377de600f628d819a0cda46c102f: chokidar-cli@https://codeload.github.com/open-cli-tools/chokidar-cli/tar.gz/8dd8a1e8631d377de600f628d819a0cda46c102f:
resolution: {tarball: https://codeload.github.com/open-cli-tools/chokidar-cli/tar.gz/8dd8a1e8631d377de600f628d819a0cda46c102f} resolution: {tarball: https://codeload.github.com/open-cli-tools/chokidar-cli/tar.gz/8dd8a1e8631d377de600f628d819a0cda46c102f}
version: 4.0.0 version: 4.0.0
@@ -1592,6 +1604,9 @@ packages:
decimal.js@10.6.0: decimal.js@10.6.0:
resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
decode-named-character-reference@1.3.0:
resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==}
dedent-js@1.0.1: dedent-js@1.0.1:
resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==}
@@ -1617,6 +1632,9 @@ packages:
devalue@5.6.2: devalue@5.6.2:
resolution: {integrity: sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==} resolution: {integrity: sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==}
devlop@1.1.0:
resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
diet-sprite@0.0.1: diet-sprite@0.0.1:
resolution: {integrity: sha512-zSHI2WDAn1wJqJYxcmjWfJv3Iw8oL9reQIbEyx2x2/EZ4/qmUTIo8/5qOCurnAcq61EwtJJaZ0XTy2NRYqpB5A==} resolution: {integrity: sha512-zSHI2WDAn1wJqJYxcmjWfJv3Iw8oL9reQIbEyx2x2/EZ4/qmUTIo8/5qOCurnAcq61EwtJJaZ0XTy2NRYqpB5A==}
@@ -2155,6 +2173,66 @@ packages:
meshoptimizer@0.22.0: meshoptimizer@0.22.0:
resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==} resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==}
micromark-core-commonmark@2.0.3:
resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
micromark-factory-destination@2.0.1:
resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
micromark-factory-label@2.0.1:
resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
micromark-factory-space@2.0.1:
resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
micromark-factory-title@2.0.1:
resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
micromark-factory-whitespace@2.0.1:
resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
micromark-util-character@2.1.1:
resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
micromark-util-chunked@2.0.1:
resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
micromark-util-classify-character@2.0.1:
resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
micromark-util-combine-extensions@2.0.1:
resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
micromark-util-decode-numeric-character-reference@2.0.2:
resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
micromark-util-encode@2.0.1:
resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
micromark-util-html-tag-name@2.0.1:
resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
micromark-util-normalize-identifier@2.0.1:
resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
micromark-util-resolve-all@2.0.1:
resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
micromark-util-sanitize-uri@2.0.1:
resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
micromark-util-subtokenize@2.1.0:
resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==}
micromark-util-symbol@2.0.1:
resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
micromark-util-types@2.0.2:
resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
micromark@4.0.2:
resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
mime-db@1.52.0: mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
@@ -3593,6 +3671,10 @@ snapshots:
'@types/cookie@0.6.0': {} '@types/cookie@0.6.0': {}
'@types/debug@4.1.12':
dependencies:
'@types/ms': 2.1.0
'@types/deep-eql@4.0.2': {} '@types/deep-eql@4.0.2': {}
'@types/eslint@9.6.1': '@types/eslint@9.6.1':
@@ -3606,6 +3688,8 @@ snapshots:
'@types/json-schema@7.0.15': {} '@types/json-schema@7.0.15': {}
'@types/ms@2.1.0': {}
'@types/node@22.8.6': '@types/node@22.8.6':
dependencies: dependencies:
undici-types: 6.19.8 undici-types: 6.19.8
@@ -3920,6 +4004,8 @@ snapshots:
ansi-styles: 4.3.0 ansi-styles: 4.3.0
supports-color: 7.2.0 supports-color: 7.2.0
character-entities@2.0.2: {}
chokidar-cli@https://codeload.github.com/open-cli-tools/chokidar-cli/tar.gz/8dd8a1e8631d377de600f628d819a0cda46c102f: chokidar-cli@https://codeload.github.com/open-cli-tools/chokidar-cli/tar.gz/8dd8a1e8631d377de600f628d819a0cda46c102f:
dependencies: dependencies:
chokidar: 3.6.0 chokidar: 3.6.0
@@ -4038,6 +4124,10 @@ snapshots:
decimal.js@10.6.0: decimal.js@10.6.0:
optional: true optional: true
decode-named-character-reference@1.3.0:
dependencies:
character-entities: 2.0.2
dedent-js@1.0.1: {} dedent-js@1.0.1: {}
deep-is@0.1.4: {} deep-is@0.1.4: {}
@@ -4053,6 +4143,10 @@ snapshots:
devalue@5.6.2: {} devalue@5.6.2: {}
devlop@1.1.0:
dependencies:
dequal: 2.0.3
diet-sprite@0.0.1: {} diet-sprite@0.0.1: {}
diff@4.0.4: diff@4.0.4:
@@ -4661,6 +4755,132 @@ snapshots:
meshoptimizer@0.22.0: {} meshoptimizer@0.22.0: {}
micromark-core-commonmark@2.0.3:
dependencies:
decode-named-character-reference: 1.3.0
devlop: 1.1.0
micromark-factory-destination: 2.0.1
micromark-factory-label: 2.0.1
micromark-factory-space: 2.0.1
micromark-factory-title: 2.0.1
micromark-factory-whitespace: 2.0.1
micromark-util-character: 2.1.1
micromark-util-chunked: 2.0.1
micromark-util-classify-character: 2.0.1
micromark-util-html-tag-name: 2.0.1
micromark-util-normalize-identifier: 2.0.1
micromark-util-resolve-all: 2.0.1
micromark-util-subtokenize: 2.1.0
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.2
micromark-factory-destination@2.0.1:
dependencies:
micromark-util-character: 2.1.1
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.2
micromark-factory-label@2.0.1:
dependencies:
devlop: 1.1.0
micromark-util-character: 2.1.1
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.2
micromark-factory-space@2.0.1:
dependencies:
micromark-util-character: 2.1.1
micromark-util-types: 2.0.2
micromark-factory-title@2.0.1:
dependencies:
micromark-factory-space: 2.0.1
micromark-util-character: 2.1.1
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.2
micromark-factory-whitespace@2.0.1:
dependencies:
micromark-factory-space: 2.0.1
micromark-util-character: 2.1.1
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.2
micromark-util-character@2.1.1:
dependencies:
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.2
micromark-util-chunked@2.0.1:
dependencies:
micromark-util-symbol: 2.0.1
micromark-util-classify-character@2.0.1:
dependencies:
micromark-util-character: 2.1.1
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.2
micromark-util-combine-extensions@2.0.1:
dependencies:
micromark-util-chunked: 2.0.1
micromark-util-types: 2.0.2
micromark-util-decode-numeric-character-reference@2.0.2:
dependencies:
micromark-util-symbol: 2.0.1
micromark-util-encode@2.0.1: {}
micromark-util-html-tag-name@2.0.1: {}
micromark-util-normalize-identifier@2.0.1:
dependencies:
micromark-util-symbol: 2.0.1
micromark-util-resolve-all@2.0.1:
dependencies:
micromark-util-types: 2.0.2
micromark-util-sanitize-uri@2.0.1:
dependencies:
micromark-util-character: 2.1.1
micromark-util-encode: 2.0.1
micromark-util-symbol: 2.0.1
micromark-util-subtokenize@2.1.0:
dependencies:
devlop: 1.1.0
micromark-util-chunked: 2.0.1
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.2
micromark-util-symbol@2.0.1: {}
micromark-util-types@2.0.2: {}
micromark@4.0.2:
dependencies:
'@types/debug': 4.1.12
debug: 4.4.3
decode-named-character-reference: 1.3.0
devlop: 1.1.0
micromark-core-commonmark: 2.0.3
micromark-factory-space: 2.0.1
micromark-util-character: 2.1.1
micromark-util-chunked: 2.0.1
micromark-util-combine-extensions: 2.0.1
micromark-util-decode-numeric-character-reference: 2.0.2
micromark-util-encode: 2.0.1
micromark-util-normalize-identifier: 2.0.1
micromark-util-resolve-all: 2.0.1
micromark-util-sanitize-uri: 2.0.1
micromark-util-subtokenize: 2.1.0
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.2
transitivePeerDependencies:
- supports-color
mime-db@1.52.0: mime-db@1.52.0:
optional: true optional: true