diff --git a/docs/tutorialkit.dev/package.json b/docs/tutorialkit.dev/package.json
index 7cefd8a60..8a029083d 100644
--- a/docs/tutorialkit.dev/package.json
+++ b/docs/tutorialkit.dev/package.json
@@ -12,7 +12,7 @@
},
"dependencies": {
"@tutorialkit/react": "workspace:*",
- "@webcontainer/api": "1.2.4",
+ "@webcontainer/api": "1.5.1",
"classnames": "^2.5.1",
"react": "^18.3.1",
"react-dom": "^18.3.1"
diff --git a/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx b/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx
index e6431ea71..c7751a2ba 100644
--- a/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx
+++ b/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx
@@ -46,6 +46,7 @@ When overriding `TopBar` you can place TutorialKit's default components using fo
- `logo`: Logo of the application
- `open-in-stackblitz-link`: Link for opening current lesson in StackBlitz
+- `download-button`: Button for downloading current lesson as `.zip` file
- `theme-switch`: Switch for changing the theme
- `login-button`: For StackBlitz Enterprise user, the login button
@@ -61,6 +62,8 @@ When overriding `TopBar` you can place TutorialKit's default components using fo
+
+
diff --git a/docs/tutorialkit.dev/src/content/docs/reference/configuration.mdx b/docs/tutorialkit.dev/src/content/docs/reference/configuration.mdx
index 31707ca94..0c99cdb9d 100644
--- a/docs/tutorialkit.dev/src/content/docs/reference/configuration.mdx
+++ b/docs/tutorialkit.dev/src/content/docs/reference/configuration.mdx
@@ -412,6 +412,20 @@ type TemplateType = "html" | "node" | "angular-cli" | "create-react-app" | "java
```
+### `downloadAsZip`
+Display a button for downloading the current lesson as `.zip` file. Defaults to `false`.
+The default filename is constructed by concatenating folder names of part, chapter and lesson.
+
+
+The `DownloadAsZip` type has the following shape:
+
+```ts
+type DownloadAsZip =
+ | boolean
+ | { filename?: string }
+
+```
+
##### `meta`
Configures `` tags for Open Graph protocole and Twitter.
diff --git a/e2e/package.json b/e2e/package.json
index d21b1326c..23f8fcd1b 100644
--- a/e2e/package.json
+++ b/e2e/package.json
@@ -34,6 +34,7 @@
"playwright": "^1.46.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "unocss": "^0.59.4"
+ "unocss": "^0.59.4",
+ "unzipper": "^0.12.3"
}
}
diff --git a/e2e/src/components/TopBar.astro b/e2e/src/components/TopBar.astro
index 099610741..93b00d6e9 100644
--- a/e2e/src/components/TopBar.astro
+++ b/e2e/src/components/TopBar.astro
@@ -7,6 +7,10 @@
Custom Top Bar Mounted
+
+
+
+
diff --git a/e2e/src/content/tutorial/meta.md b/e2e/src/content/tutorial/meta.md
index 29eef72cd..da65467f9 100644
--- a/e2e/src/content/tutorial/meta.md
+++ b/e2e/src/content/tutorial/meta.md
@@ -2,4 +2,5 @@
type: tutorial
mainCommand: ''
prepareCommands: []
+downloadAsZip: true
---
diff --git a/e2e/test/topbar.override-components.test.ts b/e2e/test/topbar.override-components.test.ts
index cb34ba1cf..62bf8d68e 100644
--- a/e2e/test/topbar.override-components.test.ts
+++ b/e2e/test/topbar.override-components.test.ts
@@ -7,6 +7,7 @@ test('developer can override TopBar', async ({ page }) => {
await expect(nav.getByText('Custom Top Bar Mounted')).toBeVisible();
// default elements should also be visible
+ await expect(nav.getByRole('button', { name: 'Download lesson as zip-file' })).toBeVisible();
await expect(nav.getByRole('button', { name: 'Open in StackBlitz' })).toBeVisible();
await expect(nav.getByRole('button', { name: 'Toggle Theme' })).toBeVisible();
});
diff --git a/e2e/test/topbar.test.ts b/e2e/test/topbar.test.ts
new file mode 100644
index 000000000..07e207923
--- /dev/null
+++ b/e2e/test/topbar.test.ts
@@ -0,0 +1,78 @@
+///
+import { readdirSync, readFileSync, rmSync } from 'node:fs';
+import type { Readable } from 'node:stream';
+import { test, expect } from '@playwright/test';
+import * as unzipper from 'unzipper';
+import { theme } from '../../packages/theme/src/theme';
+
+test('user can change theme', async ({ page }) => {
+ await page.goto('/');
+
+ const heading = page.getByRole('heading', { level: 1 });
+ const html = page.locator('html');
+
+ // default light theme
+ await expect(html).toHaveAttribute('data-theme', 'light');
+ await expect(heading).toHaveCSS('color', hexToRGB(theme.colors.gray[800]));
+
+ await page.getByRole('navigation').getByRole('button', { name: 'Toggle Theme' }).click();
+
+ await expect(html).toHaveAttribute('data-theme', 'dark');
+ await expect(heading).toHaveCSS('color', hexToRGB(theme.colors.gray[200]));
+});
+
+test('user can download project as zip', async ({ page }) => {
+ await page.goto('/', { waitUntil: 'networkidle' });
+
+ const downloadPromise = page.waitForEvent('download');
+ await page.getByRole('navigation').getByRole('button', { name: 'Download lesson as zip-file' }).click();
+
+ const download = await downloadPromise;
+ expect(download.suggestedFilename()).toBe('tests-file-tree-allow-edits-disabled.zip');
+
+ const stream = await download.createReadStream();
+ const files = await unzip(stream);
+
+ expect(files).toMatchObject({
+ './tutorial/file-on-template.js': "export default 'This file is present on template';\n",
+ './tutorial/first-level/file.js': "export default 'File in first level';\n",
+ './tutorial/first-level/second-level/file.js': "export default 'File in second level';\n",
+ });
+
+ expect(files['./tutorial/index.mjs']).toMatch("import http from 'node:http'");
+});
+
+function hexToRGB(hex: string) {
+ return `rgb(${parseInt(hex.slice(1, 3), 16)}, ${parseInt(hex.slice(3, 5), 16)}, ${parseInt(hex.slice(5, 7), 16)})`;
+}
+
+async function unzip(stream: Readable) {
+ await stream.pipe(unzipper.Extract({ path: './downloads' })).promise();
+
+ const files = readDirectoryContents('./downloads');
+ rmSync('./downloads', { recursive: true });
+
+ return files.reduce(
+ (all, current) => ({
+ ...all,
+ [current.name.replace('/downloads', '')]: current.content,
+ }),
+ {},
+ );
+}
+
+function readDirectoryContents(directory: string) {
+ const files: { name: string; content: string }[] = [];
+
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
+ const name = `${directory}/${entry.name}`;
+
+ if (entry.isFile()) {
+ files.push({ name, content: readFileSync(name, 'utf-8') });
+ } else if (entry.isDirectory()) {
+ files.push(...readDirectoryContents(name));
+ }
+ }
+
+ return files;
+}
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 6ee7c7400..ad6064437 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -45,7 +45,7 @@
"@tutorialkit/types": "workspace:*",
"@types/react": "^18.3.3",
"@unocss/reset": "^0.62.2",
- "@webcontainer/api": "1.2.4",
+ "@webcontainer/api": "1.5.1",
"astro": "^4.15.0",
"astro-expressive-code": "^0.35.3",
"chokidar": "3.6.0",
diff --git a/packages/astro/src/default/components/DownloadButton.tsx b/packages/astro/src/default/components/DownloadButton.tsx
new file mode 100644
index 000000000..a0b2f3904
--- /dev/null
+++ b/packages/astro/src/default/components/DownloadButton.tsx
@@ -0,0 +1,44 @@
+import { tutorialStore, webcontainer as webcontainerPromise } from './webcontainer.js';
+
+export function DownloadButton() {
+ return (
+
+ );
+}
+
+async function onClick() {
+ const lesson = tutorialStore.lesson;
+
+ if (!lesson) {
+ throw new Error('Missing lesson');
+ }
+
+ const webcontainer = await webcontainerPromise;
+ const data = await webcontainer.export('/home/tutorial', { format: 'zip', excludes: ['node_modules'] });
+
+ let filename =
+ typeof lesson.data.downloadAsZip === 'object'
+ ? lesson.data.downloadAsZip.filename
+ : [lesson.part?.id, lesson.chapter?.id, lesson.id].filter(Boolean).join('-');
+
+ if (!filename.endsWith('.zip')) {
+ filename += '.zip';
+ }
+
+ const link = document.createElement('a');
+ link.style.display = 'none';
+ link.download = filename;
+ link.href = URL.createObjectURL(new Blob([data], { type: 'application/zip' }));
+
+ document.body.appendChild(link);
+ link.click();
+
+ document.body.removeChild(link);
+ URL.revokeObjectURL(link.href);
+}
diff --git a/packages/astro/src/default/components/TopBar.astro b/packages/astro/src/default/components/TopBar.astro
index 861441723..0cfb1bcdc 100644
--- a/packages/astro/src/default/components/TopBar.astro
+++ b/packages/astro/src/default/components/TopBar.astro
@@ -4,6 +4,10 @@
+
+
+
+
diff --git a/packages/astro/src/default/components/TopBarWrapper.astro b/packages/astro/src/default/components/TopBarWrapper.astro
index 1d3b89101..9e7c7aab0 100644
--- a/packages/astro/src/default/components/TopBarWrapper.astro
+++ b/packages/astro/src/default/components/TopBarWrapper.astro
@@ -3,6 +3,7 @@ import { TopBar } from 'tutorialkit:override-components';
import type { Lesson } from '@tutorialkit/types';
import { ThemeSwitch } from './ThemeSwitch';
import { LoginButton } from './LoginButton';
+import { DownloadButton } from './DownloadButton';
import { OpenInStackblitzLink } from './OpenInStackblitzLink';
import Logo from './Logo.astro';
import { useAuth } from './setup';
@@ -10,14 +11,17 @@ import { useAuth } from './setup';
interface Props {
logoLink: string;
openInStackBlitz: Lesson['data']['openInStackBlitz'];
+ downloadAsZip: Lesson['data']['downloadAsZip'];
}
-const { logoLink, openInStackBlitz } = Astro.props;
+const { logoLink, openInStackBlitz, downloadAsZip } = Astro.props;
---
+ {downloadAsZip && }
+
{openInStackBlitz && }
diff --git a/packages/astro/src/default/pages/[...slug].astro b/packages/astro/src/default/pages/[...slug].astro
index 1a88bfefb..18b86ff22 100644
--- a/packages/astro/src/default/pages/[...slug].astro
+++ b/packages/astro/src/default/pages/[...slug].astro
@@ -24,9 +24,16 @@ meta.description ??= 'A TutorialKit interactive lesson';
+
+
-
+
+
diff --git a/packages/astro/src/default/utils/__snapshots__/multiple-parts.json b/packages/astro/src/default/utils/__snapshots__/multiple-parts.json
index 42fa3bb17..35cce10f0 100644
--- a/packages/astro/src/default/utils/__snapshots__/multiple-parts.json
+++ b/packages/astro/src/default/utils/__snapshots__/multiple-parts.json
@@ -70,7 +70,8 @@
"i18n": {
"mocked": "default localization"
},
- "openInStackBlitz": true
+ "openInStackBlitz": true,
+ "downloadAsZip": false
},
"id": "1-first",
"filepath": "1-part/1-chapter/1-first/content.md",
@@ -106,7 +107,8 @@
"i18n": {
"mocked": "default localization"
},
- "openInStackBlitz": true
+ "openInStackBlitz": true,
+ "downloadAsZip": false
},
"id": "1-second",
"filepath": "2-part/2-chapter/1-second/content.md",
@@ -146,7 +148,8 @@
"i18n": {
"mocked": "default localization"
},
- "openInStackBlitz": true
+ "openInStackBlitz": true,
+ "downloadAsZip": false
},
"id": "1-third",
"filepath": "3-part/3-chapter/1-third/content.md",
diff --git a/packages/astro/src/default/utils/__snapshots__/single-lesson-no-part.json b/packages/astro/src/default/utils/__snapshots__/single-lesson-no-part.json
index 8455d92cc..12488d1a1 100644
--- a/packages/astro/src/default/utils/__snapshots__/single-lesson-no-part.json
+++ b/packages/astro/src/default/utils/__snapshots__/single-lesson-no-part.json
@@ -9,7 +9,8 @@
"i18n": {
"mocked": "default localization"
},
- "openInStackBlitz": true
+ "openInStackBlitz": true,
+ "downloadAsZip": false
},
"id": "1-lesson",
"filepath": "1-lesson/content.md",
diff --git a/packages/astro/src/default/utils/__snapshots__/single-part-and-lesson-no-chapter.json b/packages/astro/src/default/utils/__snapshots__/single-part-and-lesson-no-chapter.json
index 447e765b3..0fc4b6e12 100644
--- a/packages/astro/src/default/utils/__snapshots__/single-part-and-lesson-no-chapter.json
+++ b/packages/astro/src/default/utils/__snapshots__/single-part-and-lesson-no-chapter.json
@@ -20,7 +20,8 @@
"i18n": {
"mocked": "default localization"
},
- "openInStackBlitz": true
+ "openInStackBlitz": true,
+ "downloadAsZip": false
},
"id": "1-lesson",
"filepath": "1-part/1-lesson/content.md",
diff --git a/packages/astro/src/default/utils/__snapshots__/single-part-chapter-and-lesson.json b/packages/astro/src/default/utils/__snapshots__/single-part-chapter-and-lesson.json
index bd70e0a18..6b6d4c788 100644
--- a/packages/astro/src/default/utils/__snapshots__/single-part-chapter-and-lesson.json
+++ b/packages/astro/src/default/utils/__snapshots__/single-part-chapter-and-lesson.json
@@ -30,7 +30,8 @@
"i18n": {
"mocked": "default localization"
},
- "openInStackBlitz": true
+ "openInStackBlitz": true,
+ "downloadAsZip": false
},
"id": "1-lesson",
"filepath": "1-part/1-chapter/1-lesson/content.md",
diff --git a/packages/astro/src/default/utils/__snapshots__/single-part-chapter-and-multiple-lessons.json b/packages/astro/src/default/utils/__snapshots__/single-part-chapter-and-multiple-lessons.json
index 68fc92ca5..73d1c265a 100644
--- a/packages/astro/src/default/utils/__snapshots__/single-part-chapter-and-multiple-lessons.json
+++ b/packages/astro/src/default/utils/__snapshots__/single-part-chapter-and-multiple-lessons.json
@@ -30,7 +30,8 @@
"i18n": {
"mocked": "default localization"
},
- "openInStackBlitz": true
+ "openInStackBlitz": true,
+ "downloadAsZip": false
},
"id": "1-first",
"filepath": "1-part/1-chapter/1-first/content.md",
@@ -66,7 +67,8 @@
"i18n": {
"mocked": "default localization"
},
- "openInStackBlitz": true
+ "openInStackBlitz": true,
+ "downloadAsZip": false
},
"id": "2-second",
"filepath": "1-part/1-chapter/2-second/content.md",
@@ -106,7 +108,8 @@
"i18n": {
"mocked": "default localization"
},
- "openInStackBlitz": true
+ "openInStackBlitz": true,
+ "downloadAsZip": false
},
"id": "3-third",
"filepath": "1-part/1-chapter/3-third/content.md",
diff --git a/packages/astro/src/default/utils/__snapshots__/single-part-multiple-chapters.json b/packages/astro/src/default/utils/__snapshots__/single-part-multiple-chapters.json
index 3504e10f6..b3848743b 100644
--- a/packages/astro/src/default/utils/__snapshots__/single-part-multiple-chapters.json
+++ b/packages/astro/src/default/utils/__snapshots__/single-part-multiple-chapters.json
@@ -48,7 +48,8 @@
"i18n": {
"mocked": "default localization"
},
- "openInStackBlitz": true
+ "openInStackBlitz": true,
+ "downloadAsZip": false
},
"id": "1-first",
"filepath": "1-part/1-chapter/1-first/content.md",
@@ -84,7 +85,8 @@
"i18n": {
"mocked": "default localization"
},
- "openInStackBlitz": true
+ "openInStackBlitz": true,
+ "downloadAsZip": false
},
"id": "1-second",
"filepath": "1-part/2-chapter/1-second/content.md",
@@ -124,7 +126,8 @@
"i18n": {
"mocked": "default localization"
},
- "openInStackBlitz": true
+ "openInStackBlitz": true,
+ "downloadAsZip": false
},
"id": "1-third",
"filepath": "1-part/3-chapter/1-third/content.md",
diff --git a/packages/astro/src/default/utils/content.ts b/packages/astro/src/default/utils/content.ts
index 7567b40c8..9bd2eb1a0 100644
--- a/packages/astro/src/default/utils/content.ts
+++ b/packages/astro/src/default/utils/content.ts
@@ -97,6 +97,7 @@ export async function getTutorial(): Promise {
'meta',
'editPageLink',
'openInStackBlitz',
+ 'downloadAsZip',
'filesystem',
]),
};
@@ -160,6 +161,7 @@ async function parseCollection(collection: CollectionEntryTutorial[]) {
tutorialMetaData.template ??= 'default';
tutorialMetaData.i18n = Object.assign({ ...DEFAULT_LOCALIZATION }, tutorialMetaData.i18n);
tutorialMetaData.openInStackBlitz ??= true;
+ tutorialMetaData.downloadAsZip ??= false;
tutorial.logoLink = data.logoLink;
} else if (type === 'part') {
diff --git a/packages/cli/overwrites/src/content/tutorial/meta.md b/packages/cli/overwrites/src/content/tutorial/meta.md
index 86a50e02e..984d22f0f 100644
--- a/packages/cli/overwrites/src/content/tutorial/meta.md
+++ b/packages/cli/overwrites/src/content/tutorial/meta.md
@@ -3,4 +3,5 @@ type: tutorial
mainCommand: ['npm run dev', 'Starting http server']
prepareCommands:
- ['npm install', 'Installing dependencies']
+downloadAsZip: true
---
diff --git a/packages/cli/tests/__snapshots__/create-tutorial.test.ts.snap b/packages/cli/tests/__snapshots__/create-tutorial.test.ts.snap
index dd6190482..5560ad7dd 100644
--- a/packages/cli/tests/__snapshots__/create-tutorial.test.ts.snap
+++ b/packages/cli/tests/__snapshots__/create-tutorial.test.ts.snap
@@ -235,6 +235,7 @@ exports[`create and eject a project 1`] = `
"public/logo.svg",
"src",
"src/components",
+ "src/components/DownloadButton.tsx",
"src/components/HeadTags.astro",
"src/components/LoginButton.tsx",
"src/components/Logo.astro",
diff --git a/packages/react/package.json b/packages/react/package.json
index e69a7087e..0d840a590 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -85,7 +85,7 @@
"@replit/codemirror-lang-svelte": "^6.0.0",
"@tutorialkit/runtime": "workspace:*",
"@tutorialkit/theme": "workspace:*",
- "@webcontainer/api": "1.2.4",
+ "@webcontainer/api": "1.5.1",
"@xterm/addon-fit": "^0.10.0",
"@xterm/addon-web-links": "^0.11.0",
"@xterm/xterm": "^5.5.0",
diff --git a/packages/runtime/package.json b/packages/runtime/package.json
index 431081e95..17037585b 100644
--- a/packages/runtime/package.json
+++ b/packages/runtime/package.json
@@ -34,7 +34,7 @@
},
"dependencies": {
"@tutorialkit/types": "workspace:*",
- "@webcontainer/api": "1.2.4",
+ "@webcontainer/api": "1.5.1",
"nanostores": "^0.10.3",
"picomatch": "^4.0.2"
},
diff --git a/packages/template/src/content/tutorial/1-basics/2-foo/meta.md b/packages/template/src/content/tutorial/1-basics/2-foo/meta.md
index df136d4ab..a0966799b 100644
--- a/packages/template/src/content/tutorial/1-basics/2-foo/meta.md
+++ b/packages/template/src/content/tutorial/1-basics/2-foo/meta.md
@@ -2,4 +2,5 @@
type: chapter
title: The second chapter in part 1
openInStackBlitz: true
+downloadAsZip: true
---
diff --git a/packages/template/src/content/tutorial/2-advanced/1-unicorn/meta.md b/packages/template/src/content/tutorial/2-advanced/1-unicorn/meta.md
index 84d84f723..4e76caaf6 100644
--- a/packages/template/src/content/tutorial/2-advanced/1-unicorn/meta.md
+++ b/packages/template/src/content/tutorial/2-advanced/1-unicorn/meta.md
@@ -2,4 +2,5 @@
type: chapter
title: The first chatper in part 2
openInStackBlitz: false
+downloadAsZip: false
---
diff --git a/packages/template/src/content/tutorial/meta.md b/packages/template/src/content/tutorial/meta.md
index 96727ddf1..c73ad5872 100644
--- a/packages/template/src/content/tutorial/meta.md
+++ b/packages/template/src/content/tutorial/meta.md
@@ -12,4 +12,6 @@ i18n:
openInStackBlitz:
projectTitle: Example Title
projectDescription: Example Description
+downloadAsZip:
+ filename: custom-lesson-name-without-extension
---
diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json
index 8057b322b..30a7d4f80 100644
--- a/packages/test-utils/package.json
+++ b/packages/test-utils/package.json
@@ -5,7 +5,7 @@
"type": "module",
"private": true,
"devDependencies": {
- "@webcontainer/api": "1.2.4",
+ "@webcontainer/api": "1.5.1",
"typescript": "^5.4.5",
"vitest": "^2.1.1"
}
diff --git a/packages/types/src/schemas/common.ts b/packages/types/src/schemas/common.ts
index 4f3972a40..c669bb92f 100644
--- a/packages/types/src/schemas/common.ts
+++ b/packages/types/src/schemas/common.ts
@@ -292,6 +292,17 @@ export const webcontainerSchema = commandsSchema.extend({
])
.optional()
.describe('Display a link for opening current lesson in StackBlitz.'),
+ downloadAsZip: z
+ .union([
+ // `false` for disabling the button
+ z.boolean(),
+
+ z.strictObject({
+ filename: z.string(),
+ }),
+ ])
+ .optional()
+ .describe('Display a button for downloading the current lesson as `.zip` file.'),
});
export const baseSchema = webcontainerSchema.extend({
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 46bfbeabb..3aadc0202 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -25,7 +25,7 @@ importers:
version: 5.3.0
commitlint:
specifier: ^19.3.0
- version: 19.3.0(@types/node@22.4.2)(typescript@5.5.3)
+ version: 19.3.0(@types/node@22.9.0)(typescript@5.5.3)
conventional-changelog:
specifier: ^6.0.0
version: 6.0.0
@@ -80,7 +80,7 @@ importers:
version: 18.3.3
astro:
specifier: ^4.15.0
- version: 4.15.0(@types/node@22.4.2)(typescript@5.5.3)
+ version: 4.15.0(@types/node@22.9.0)(typescript@5.5.3)
prettier-plugin-astro:
specifier: ^0.14.1
version: 0.14.1
@@ -94,8 +94,8 @@ importers:
specifier: workspace:*
version: link:../../packages/react
'@webcontainer/api':
- specifier: 1.2.4
- version: 1.2.4
+ specifier: 1.5.1
+ version: 1.5.1
classnames:
specifier: ^2.5.1
version: 2.5.1
@@ -132,7 +132,7 @@ importers:
version: 18.3.0
astro:
specifier: ^4.15.0
- version: 4.15.0(@types/node@22.4.2)(sass@1.77.6)(typescript@5.5.3)
+ version: 4.15.0(@types/node@22.9.0)(sass@1.77.6)(typescript@5.5.3)
sass:
specifier: ^1.77.6
version: 1.77.6
@@ -180,7 +180,7 @@ importers:
version: link:../packages/types
'@types/node':
specifier: ^22.2.0
- version: 22.4.2
+ version: 22.9.0
'@types/react':
specifier: ^18.3.3
version: 18.3.3
@@ -195,7 +195,7 @@ importers:
version: 0.62.2
astro:
specifier: ^4.15.0
- version: 4.15.0(@types/node@22.4.2)(typescript@5.5.3)
+ version: 4.15.0(@types/node@22.9.0)(typescript@5.5.3)
fast-glob:
specifier: ^3.3.2
version: 3.3.2
@@ -211,6 +211,9 @@ importers:
unocss:
specifier: ^0.59.4
version: 0.59.4(postcss@8.4.41)(vite@5.4.2)
+ unzipper:
+ specifier: ^0.12.3
+ version: 0.12.3
extensions/vscode:
dependencies:
@@ -283,7 +286,7 @@ importers:
version: 3.1.0
vitest:
specifier: ^2.1.1
- version: 2.1.1(@types/node@22.4.2)
+ version: 2.1.1(@types/node@22.9.0)
packages/astro:
dependencies:
@@ -324,11 +327,11 @@ importers:
specifier: ^0.62.2
version: 0.62.3
'@webcontainer/api':
- specifier: 1.2.4
- version: 1.2.4
+ specifier: 1.5.1
+ version: 1.5.1
astro:
specifier: ^4.15.0
- version: 4.15.0(@types/node@22.4.2)(typescript@5.5.3)
+ version: 4.15.0(@types/node@22.9.0)(typescript@5.5.3)
astro-expressive-code:
specifier: ^0.35.3
version: 0.35.3(astro@4.15.0)
@@ -398,7 +401,7 @@ importers:
version: 0.8.4(vite@5.4.2)
vitest:
specifier: ^2.1.1
- version: 2.1.1(@types/node@22.4.2)
+ version: 2.1.1(@types/node@22.9.0)
packages/cli:
dependencies:
@@ -561,8 +564,8 @@ importers:
specifier: workspace:*
version: link:../theme
'@webcontainer/api':
- specifier: 1.2.4
- version: 1.2.4
+ specifier: 1.5.1
+ version: 1.5.1
'@xterm/addon-fit':
specifier: ^0.10.0
version: 0.10.0(@xterm/xterm@5.5.0)
@@ -614,7 +617,7 @@ importers:
version: 5.5.3
vitest:
specifier: ^2.1.1
- version: 2.1.1(@types/node@22.4.2)
+ version: 2.1.1(@types/node@22.9.0)
packages/runtime:
dependencies:
@@ -622,8 +625,8 @@ importers:
specifier: workspace:*
version: link:../types
'@webcontainer/api':
- specifier: 1.2.4
- version: 1.2.4
+ specifier: 1.5.1
+ version: 1.5.1
nanostores:
specifier: ^0.10.3
version: 0.10.3
@@ -639,13 +642,13 @@ importers:
version: 5.5.3
vite:
specifier: ^5.3.1
- version: 5.3.4(@types/node@22.4.2)
+ version: 5.3.4(@types/node@22.9.0)
vite-tsconfig-paths:
specifier: ^4.3.2
version: 4.3.2(typescript@5.5.3)(vite@5.3.4)
vitest:
specifier: ^2.1.1
- version: 2.1.1(@types/node@22.4.2)
+ version: 2.1.1(@types/node@22.9.0)
packages/template:
dependencies:
@@ -693,14 +696,14 @@ importers:
packages/test-utils:
devDependencies:
'@webcontainer/api':
- specifier: 1.2.4
- version: 1.2.4
+ specifier: 1.5.1
+ version: 1.5.1
typescript:
specifier: ^5.4.5
version: 5.5.3
vitest:
specifier: ^2.1.1
- version: 2.1.1(@types/node@22.4.2)
+ version: 2.1.1(@types/node@22.9.0)
packages/theme:
dependencies:
@@ -738,7 +741,7 @@ importers:
version: 5.5.3
vitest:
specifier: ^2.1.1
- version: 2.1.1(@types/node@22.4.2)
+ version: 2.1.1(@types/node@22.9.0)
packages:
@@ -877,7 +880,7 @@ packages:
'@astrojs/markdown-remark': 5.1.0
'@mdx-js/mdx': 3.0.1
acorn: 8.12.0
- astro: 4.15.0(@types/node@22.4.2)(typescript@5.5.3)
+ astro: 4.15.0(@types/node@22.9.0)(typescript@5.5.3)
es-module-lexer: 1.5.3
estree-util-visit: 2.0.0
github-slugger: 2.0.0
@@ -936,7 +939,7 @@ packages:
'@pagefind/default-ui': 1.1.0
'@types/hast': 3.0.4
'@types/mdast': 4.0.4
- astro: 4.15.0(@types/node@22.4.2)(sass@1.77.6)(typescript@5.5.3)
+ astro: 4.15.0(@types/node@22.9.0)(sass@1.77.6)(typescript@5.5.3)
astro-expressive-code: 0.35.3(astro@4.15.0)
bcp-47: 2.1.0
hast-util-from-html: 2.0.1
@@ -1663,14 +1666,14 @@ packages:
style-mod: 4.1.2
w3c-keyname: 2.2.8
- /@commitlint/cli@19.3.0(@types/node@22.4.2)(typescript@5.5.3):
+ /@commitlint/cli@19.3.0(@types/node@22.9.0)(typescript@5.5.3):
resolution: {integrity: sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==}
engines: {node: '>=v18'}
hasBin: true
dependencies:
'@commitlint/format': 19.3.0
'@commitlint/lint': 19.2.2
- '@commitlint/load': 19.2.0(@types/node@22.4.2)(typescript@5.5.3)
+ '@commitlint/load': 19.2.0(@types/node@22.9.0)(typescript@5.5.3)
'@commitlint/read': 19.2.1
'@commitlint/types': 19.0.3
execa: 8.0.1
@@ -1739,7 +1742,7 @@ packages:
'@commitlint/types': 19.0.3
dev: true
- /@commitlint/load@19.2.0(@types/node@22.4.2)(typescript@5.5.3):
+ /@commitlint/load@19.2.0(@types/node@22.9.0)(typescript@5.5.3):
resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==}
engines: {node: '>=v18'}
dependencies:
@@ -1749,7 +1752,7 @@ packages:
'@commitlint/types': 19.0.3
chalk: 5.3.0
cosmiconfig: 9.0.0(typescript@5.5.3)
- cosmiconfig-typescript-loader: 5.0.0(@types/node@22.4.2)(cosmiconfig@9.0.0)(typescript@5.5.3)
+ cosmiconfig-typescript-loader: 5.0.0(@types/node@22.9.0)(cosmiconfig@9.0.0)(typescript@5.5.3)
lodash.isplainobject: 4.0.6
lodash.merge: 4.6.2
lodash.uniq: 4.5.0
@@ -3701,7 +3704,7 @@ packages:
/@types/conventional-commits-parser@5.0.0:
resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==}
dependencies:
- '@types/node': 22.4.2
+ '@types/node': 22.9.0
dev: true
/@types/cookie@0.6.0:
@@ -3731,7 +3734,7 @@ packages:
resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==}
dependencies:
'@types/jsonfile': 6.1.4
- '@types/node': 20.14.11
+ '@types/node': 22.9.0
dev: true
/@types/gtag.js@0.0.20:
@@ -3750,7 +3753,7 @@ packages:
/@types/jsonfile@6.1.4:
resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==}
dependencies:
- '@types/node': 22.4.2
+ '@types/node': 22.9.0
dev: true
/@types/mdast@4.0.4:
@@ -3788,6 +3791,12 @@ packages:
resolution: {integrity: sha512-nAvM3Ey230/XzxtyDcJ+VjvlzpzoHwLsF7JaDRfoI0ytO0mVheerNmM45CtA0yOILXwXXxOrcUWH3wltX+7PSw==}
dependencies:
undici-types: 6.19.8
+ dev: true
+
+ /@types/node@22.9.0:
+ resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==}
+ dependencies:
+ undici-types: 6.19.8
/@types/normalize-package-data@2.4.4:
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
@@ -3814,7 +3823,7 @@ packages:
/@types/sax@1.2.7:
resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
dependencies:
- '@types/node': 22.4.2
+ '@types/node': 22.9.0
dev: true
/@types/semver@7.5.8:
@@ -4018,7 +4027,7 @@ packages:
'@unocss/core': 0.59.4
'@unocss/reset': 0.59.4
'@unocss/vite': 0.59.4(vite@5.4.2)
- vite: 5.4.2(@types/node@22.4.2)(sass@1.77.6)
+ vite: 5.4.2(@types/node@22.9.0)(sass@1.77.6)
transitivePeerDependencies:
- rollup
@@ -4217,7 +4226,7 @@ packages:
chokidar: 3.6.0
fast-glob: 3.3.2
magic-string: 0.30.11
- vite: 5.4.2(@types/node@22.4.2)(sass@1.77.6)
+ vite: 5.4.2(@types/node@22.9.0)(sass@1.77.6)
transitivePeerDependencies:
- rollup
@@ -4232,7 +4241,7 @@ packages:
'@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
- vite: 5.4.2(@types/node@22.4.2)
+ vite: 5.4.2(@types/node@22.9.0)
transitivePeerDependencies:
- supports-color
@@ -4259,7 +4268,7 @@ packages:
'@vitest/spy': 2.1.1
estree-walker: 3.0.3
magic-string: 0.30.11
- vite: 5.4.2(@types/node@22.4.2)
+ vite: 5.4.2(@types/node@22.9.0)
/@vitest/pretty-format@2.1.1:
resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==}
@@ -4425,8 +4434,8 @@ packages:
resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==}
dev: true
- /@webcontainer/api@1.2.4:
- resolution: {integrity: sha512-vV42eKuat5QGz7agFJupT5sZj0CHOj/gg6J3/HanvgOVETt7gupzR+iuVNHwudS3yuW+x78Ai7T6fwvV7uBThQ==}
+ /@webcontainer/api@1.5.1:
+ resolution: {integrity: sha512-+ELk+TbTOUx0LawAUdB+nnxaofg/FxUXo/Ac/+CzHSP3SOc3ebBAW3fLo4UZfvJdUW+ygWZOiQMthPLQXvKZEg==}
/@xterm/addon-fit@0.10.0(@xterm/xterm@5.5.0):
resolution: {integrity: sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==}
@@ -4610,7 +4619,7 @@ packages:
peerDependencies:
astro: ^4.0.0-beta || ^3.3.0
dependencies:
- astro: 4.15.0(@types/node@22.4.2)(typescript@5.5.3)
+ astro: 4.15.0(@types/node@22.9.0)(typescript@5.5.3)
rehype-expressive-code: 0.35.3
/astro@4.15.0(@types/node@20.14.11)(typescript@5.5.3):
@@ -4699,7 +4708,7 @@ packages:
- typescript
dev: true
- /astro@4.15.0(@types/node@22.4.2)(sass@1.77.6)(typescript@5.5.3):
+ /astro@4.15.0(@types/node@22.9.0)(sass@1.77.6)(typescript@5.5.3):
resolution: {integrity: sha512-bL2ol1+j1Xf/7Q8DQSWP1BfkBd6RkkgVsmp9TCzYklqPSeInpAYGGsAgi+SY7Sf40Vk9o+ku6Zl1zav4MLN4uA==}
engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
hasBin: true
@@ -4761,7 +4770,7 @@ packages:
tsconfck: 3.1.1(typescript@5.5.3)
unist-util-visit: 5.0.0
vfile: 6.0.3
- vite: 5.4.2(@types/node@22.4.2)(sass@1.77.6)
+ vite: 5.4.2(@types/node@22.9.0)(sass@1.77.6)
vitefu: 0.2.5(vite@5.4.2)
which-pm: 3.0.0
xxhash-wasm: 1.0.2
@@ -4785,7 +4794,7 @@ packages:
- typescript
dev: true
- /astro@4.15.0(@types/node@22.4.2)(typescript@5.5.3):
+ /astro@4.15.0(@types/node@22.9.0)(typescript@5.5.3):
resolution: {integrity: sha512-bL2ol1+j1Xf/7Q8DQSWP1BfkBd6RkkgVsmp9TCzYklqPSeInpAYGGsAgi+SY7Sf40Vk9o+ku6Zl1zav4MLN4uA==}
engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
hasBin: true
@@ -4847,7 +4856,7 @@ packages:
tsconfck: 3.1.1(typescript@5.5.3)
unist-util-visit: 5.0.0
vfile: 6.0.3
- vite: 5.4.2(@types/node@22.4.2)
+ vite: 5.4.2(@types/node@22.9.0)
vitefu: 0.2.5(vite@5.4.2)
which-pm: 3.0.0
xxhash-wasm: 1.0.2
@@ -4962,6 +4971,10 @@ packages:
readable-stream: 3.6.2
dev: true
+ /bluebird@3.7.2:
+ resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+ dev: true
+
/boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
@@ -5200,6 +5213,7 @@ packages:
/color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
+ requiresBuild: true
dependencies:
color-name: 1.1.4
@@ -5231,12 +5245,12 @@ packages:
/comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
- /commitlint@19.3.0(@types/node@22.4.2)(typescript@5.5.3):
+ /commitlint@19.3.0(@types/node@22.9.0)(typescript@5.5.3):
resolution: {integrity: sha512-B8eUVQCjz+1ZAjR3LC3+vzKg7c4/qN4QhSxkjp0u0v7Pi79t9CsnGAluvveKmFh56e885zgToPL5ax+l8BHTPg==}
engines: {node: '>=v18'}
hasBin: true
dependencies:
- '@commitlint/cli': 19.3.0(@types/node@22.4.2)(typescript@5.5.3)
+ '@commitlint/cli': 19.3.0(@types/node@22.9.0)(typescript@5.5.3)
'@commitlint/types': 19.0.3
transitivePeerDependencies:
- '@types/node'
@@ -5425,7 +5439,11 @@ packages:
browserslist: 4.23.3
dev: true
- /cosmiconfig-typescript-loader@5.0.0(@types/node@22.4.2)(cosmiconfig@9.0.0)(typescript@5.5.3):
+ /core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+ dev: true
+
+ /cosmiconfig-typescript-loader@5.0.0(@types/node@22.9.0)(cosmiconfig@9.0.0)(typescript@5.5.3):
resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==}
engines: {node: '>=v16'}
peerDependencies:
@@ -5433,7 +5451,7 @@ packages:
cosmiconfig: '>=8.2'
typescript: '>=4'
dependencies:
- '@types/node': 22.4.2
+ '@types/node': 22.9.0
cosmiconfig: 9.0.0(typescript@5.5.3)
jiti: 1.21.6
typescript: 5.5.3
@@ -5645,6 +5663,12 @@ packages:
resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==}
engines: {node: '>=4'}
+ /duplexer2@0.1.4:
+ resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==}
+ dependencies:
+ readable-stream: 2.3.8
+ dev: true
+
/duplexer@0.1.2:
resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
@@ -6948,6 +6972,10 @@ packages:
dependencies:
is-inside-container: 1.0.0
+ /isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+ dev: true
+
/isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
@@ -7869,6 +7897,10 @@ packages:
/node-fetch-native@1.6.4:
resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==}
+ /node-int64@0.4.0:
+ resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+ dev: true
+
/node-releases@2.0.14:
resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
@@ -8323,6 +8355,10 @@ packages:
resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
engines: {node: '>=6'}
+ /process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+ dev: true
+
/prompts@2.4.2:
resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
engines: {node: '>= 6'}
@@ -8481,6 +8517,18 @@ packages:
unicorn-magic: 0.1.0
dev: true
+ /readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+ dev: true
+
/readable-stream@3.6.2:
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'}
@@ -8822,6 +8870,10 @@ packages:
resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==}
dev: true
+ /safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+ dev: true
+
/safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
dev: true
@@ -9058,7 +9110,7 @@ packages:
astro: '>=4.0.0'
dependencies:
'@astrojs/starlight': 0.23.4(astro@4.15.0)
- astro: 4.15.0(@types/node@22.4.2)(sass@1.77.6)(typescript@5.5.3)
+ astro: 4.15.0(@types/node@22.9.0)(sass@1.77.6)(typescript@5.5.3)
github-slugger: 2.0.0
hast-util-from-html: 2.0.1
hast-util-has-property: 3.0.0
@@ -9114,6 +9166,12 @@ packages:
get-east-asian-width: 1.2.0
strip-ansi: 7.1.0
+ /string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+ dependencies:
+ safe-buffer: 5.1.2
+ dev: true
+
/string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
dependencies:
@@ -9387,6 +9445,7 @@ packages:
/tslib@2.6.3:
resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
+ requiresBuild: true
/tunnel-agent@0.6.0:
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
@@ -9648,12 +9707,22 @@ packages:
'@unocss/transformer-directives': 0.59.4
'@unocss/transformer-variant-group': 0.59.4
'@unocss/vite': 0.59.4(vite@5.4.2)
- vite: 5.4.2(@types/node@22.4.2)(sass@1.77.6)
+ vite: 5.4.2(@types/node@22.9.0)(sass@1.77.6)
transitivePeerDependencies:
- postcss
- rollup
- supports-color
+ /unzipper@0.12.3:
+ resolution: {integrity: sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==}
+ dependencies:
+ bluebird: 3.7.2
+ duplexer2: 0.1.4
+ fs-extra: 11.2.0
+ graceful-fs: 4.2.11
+ node-int64: 0.4.0
+ dev: true
+
/update-browserslist-db@1.0.16(browserslist@4.23.1):
resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==}
hasBin: true
@@ -9800,6 +9869,27 @@ packages:
- sugarss
- supports-color
- terser
+ dev: true
+
+ /vite-node@2.1.1(@types/node@22.9.0):
+ resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ dependencies:
+ cac: 6.7.14
+ debug: 4.3.6
+ pathe: 1.1.2
+ vite: 5.4.2(@types/node@22.9.0)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
/vite-plugin-inspect@0.8.4(vite@5.4.2):
resolution: {integrity: sha512-G0N3rjfw+AiiwnGw50KlObIHYWfulVwaCBUBLh2xTW9G1eM9ocE5olXkEYUbwyTmX+azM8duubi+9w5awdCz+g==}
@@ -9820,7 +9910,7 @@ packages:
perfect-debounce: 1.0.0
picocolors: 1.0.1
sirv: 2.0.4
- vite: 5.4.2(@types/node@22.4.2)
+ vite: 5.4.2(@types/node@22.9.0)
transitivePeerDependencies:
- rollup
- supports-color
@@ -9837,13 +9927,13 @@ packages:
debug: 4.3.5
globrex: 0.1.2
tsconfck: 3.1.0(typescript@5.5.3)
- vite: 5.3.4(@types/node@22.4.2)
+ vite: 5.3.4(@types/node@22.9.0)
transitivePeerDependencies:
- supports-color
- typescript
dev: true
- /vite@5.3.4(@types/node@22.4.2):
+ /vite@5.3.4(@types/node@22.9.0):
resolution: {integrity: sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
@@ -9871,7 +9961,7 @@ packages:
terser:
optional: true
dependencies:
- '@types/node': 22.4.2
+ '@types/node': 22.9.0
esbuild: 0.21.5
postcss: 8.4.39
rollup: 4.18.1
@@ -9955,8 +10045,9 @@ packages:
rollup: 4.21.1
optionalDependencies:
fsevents: 2.3.3
+ dev: true
- /vite@5.4.2(@types/node@22.4.2)(sass@1.77.6):
+ /vite@5.4.2(@types/node@22.9.0):
resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
@@ -9987,7 +10078,45 @@ packages:
terser:
optional: true
dependencies:
- '@types/node': 22.4.2
+ '@types/node': 22.9.0
+ esbuild: 0.21.5
+ postcss: 8.4.41
+ rollup: 4.21.1
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ /vite@5.4.2(@types/node@22.9.0)(sass@1.77.6):
+ resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ '@types/node': 22.9.0
esbuild: 0.21.5
postcss: 8.4.41
rollup: 4.21.1
@@ -10003,7 +10132,7 @@ packages:
vite:
optional: true
dependencies:
- vite: 5.4.2(@types/node@22.4.2)
+ vite: 5.4.2(@types/node@22.9.0)
/vitest@2.1.1(@types/node@20.14.11):
resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==}
@@ -10117,6 +10246,63 @@ packages:
- sugarss
- supports-color
- terser
+ dev: true
+
+ /vitest@2.1.1(@types/node@22.9.0):
+ resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@types/node': ^18.0.0 || >=20.0.0
+ '@vitest/browser': 2.1.1
+ '@vitest/ui': 2.1.1
+ happy-dom: '*'
+ jsdom: '*'
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+ dependencies:
+ '@types/node': 22.9.0
+ '@vitest/expect': 2.1.1
+ '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.2)
+ '@vitest/pretty-format': 2.1.1
+ '@vitest/runner': 2.1.1
+ '@vitest/snapshot': 2.1.1
+ '@vitest/spy': 2.1.1
+ '@vitest/utils': 2.1.1
+ chai: 5.1.1
+ debug: 4.3.6
+ magic-string: 0.30.11
+ pathe: 1.1.2
+ std-env: 3.7.0
+ tinybench: 2.9.0
+ tinyexec: 0.3.0
+ tinypool: 1.0.1
+ tinyrainbow: 1.2.0
+ vite: 5.4.2(@types/node@22.9.0)
+ vite-node: 2.1.1(@types/node@22.9.0)
+ why-is-node-running: 2.3.0
+ transitivePeerDependencies:
+ - less
+ - lightningcss
+ - msw
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
/volar-service-css@0.0.59(@volar/language-service@2.4.0-alpha.16):
resolution: {integrity: sha512-gLNjJnECbalPvQB7qeJjhkDN8sR5M3ItbVYjnyio61aHaWptIiXm/HfDahcQ2ApwmvWidkMWWegjGq5L0BENDA==}