diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 6312a45f..f055d864 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1 +1 @@ -resolve #000 ←(`000` の部分を実際の issue 番号に書き換えてください) +resolve #2000 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 0e85c723..f154608c 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -7,19 +7,14 @@ jobs: runs-on: ubuntu-latest - strategy: - matrix: - node-version: [14.x] - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v5 with: - node-version: ${{ matrix.node-version }} + node-version: 22 + cache: 'pnpm' - name: Install deps - run: yarn + run: pnpm install - name: Run textlint - run: yarn lint - env: - CI: true + run: pnpm run lint diff --git a/.gitignore b/.gitignore index de4d1f00..638c6d8f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ +.vitepress/cache dist node_modules diff --git a/.textlintignore b/.textlintignore deleted file mode 100644 index a1892e3c..00000000 --- a/.textlintignore +++ /dev/null @@ -1 +0,0 @@ -CONTRIBUTING.md diff --git a/.textlintrc b/.textlintrc index 17650066..101e31f2 100644 --- a/.textlintrc +++ b/.textlintrc @@ -1,6 +1,8 @@ { "rules": { "preset-vuejs-jp": { + "2.1.6.カタカナの長音": true, + "4.3.1.丸かっこ()": true, "no-mix-dearu-desumasu": { "strict": false } @@ -10,8 +12,10 @@ "allowlist": { "allow": [ "->", - ">=" + ">=", + "<<<" ] - } + }, + "comments": true } } diff --git a/.vitepress/buildEnd.config.ts b/.vitepress/buildEnd.config.ts new file mode 100644 index 00000000..4f644459 --- /dev/null +++ b/.vitepress/buildEnd.config.ts @@ -0,0 +1,50 @@ +import path from 'node:path' +import { writeFileSync } from 'node:fs' +import { Feed } from 'feed' +import type { SiteConfig } from 'vitepress' +import { createContentLoader } from 'vitepress' + +const siteUrl = 'https://vite.dev' +const blogUrl = `${siteUrl}/blog` + +export const buildEnd = async (config: SiteConfig): Promise => { + const feed = new Feed({ + title: 'Vite', + description: 'Next Generation Frontend Tooling', + id: blogUrl, + link: blogUrl, + language: 'en', + image: 'https://vite.dev/og-image.jpg', + favicon: 'https://vite.dev/logo.svg', + copyright: 'Copyright © 2019-present VoidZero Inc. & Vite Contributors', + }) + + const posts = await createContentLoader('blog/*.md', { + excerpt: true, + render: true, + }).load() + + posts.sort( + (a, b) => + +new Date(b.frontmatter.date as string) - + +new Date(a.frontmatter.date as string), + ) + + for (const { url, excerpt, frontmatter, html } of posts) { + feed.addItem({ + title: frontmatter.title, + id: `${siteUrl}${url}`, + link: `${siteUrl}${url}`, + description: excerpt, + content: html, + author: [ + { + name: frontmatter.author.name, + }, + ], + date: frontmatter.date, + }) + } + + writeFileSync(path.join(config.outDir, 'blog.rss'), feed.rss2()) +} diff --git a/.vitepress/config.ts b/.vitepress/config.ts index e03b033a..ece0118a 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -1,9 +1,21 @@ -import { defineConfig, DefaultTheme } from 'vitepress' +import path from 'node:path' +import fs from 'node:fs' +import type { DefaultTheme, HeadConfig } from 'vitepress' +import { defineConfig } from 'vitepress' +import { transformerTwoslash } from '@shikijs/vitepress-twoslash' +import { + groupIconMdPlugin, + groupIconVitePlugin, +} from 'vitepress-plugin-group-icons' + + +import { markdownItImageSize } from 'markdown-it-image-size' +import { buildEnd } from './buildEnd.config' const ogDescription = '次世代フロントエンドツール' -const ogImage = 'https://vitejs.dev/og-image.png' +const ogImage = 'https://vite.dev/og-image.jpg' const ogTitle = 'Vite' -const ogUrl = 'https://vitejs.dev' +const ogUrl = 'https://vite.dev' // netlify envs const deployURL = process.env.DEPLOY_PRIME_URL || '' @@ -30,48 +42,97 @@ const additionalTitle = ((): string => { } })() const versionLinks = ((): DefaultTheme.NavItemWithLink[] => { + const oldVersions: DefaultTheme.NavItemWithLink[] = [ + { + text: 'Vite 6 ドキュメント', + link: 'https://v6.vite.dev', + }, + { + text: 'Vite 5 ドキュメント', + link: 'https://v5.vite.dev', + }, + { + text: 'Vite 4 ドキュメント', + link: 'https://v4.vite.dev', + }, + { + text: 'Vite 3 ドキュメント', + link: 'https://v3.vite.dev', + }, + { + text: 'Vite 2 ドキュメント', + link: 'https://v2.vite.dev', + }, + ] + switch (deployType) { // case 'main': case 'local': return [ { - text: 'Vite 4 Docs (release)', - link: 'https://vitejs.dev', - }, - { - text: 'Vite 3 Docs', - link: 'https://v3.vitejs.dev', - }, - { - text: 'Vite 2 Docs', - link: 'https://v2.vitejs.dev', + text: 'Vite 7 ドキュメント(リリース)', + link: 'https://vite.dev', }, + ...oldVersions, ] case 'release': - return [ - { - text: 'Vite 3 Docs', - link: 'https://v3.vitejs.dev', - }, - { - text: 'Vite 2 Docs', - link: 'https://v2.vitejs.dev', - }, - ] + return oldVersions } })() +function inlineScript(file: string): HeadConfig { + return [ + 'script', + {}, + fs.readFileSync( + path.resolve(__dirname, `./inlined-scripts/${file}`), + 'utf-8', + ), + ] +} + export default defineConfig({ title: `Vite${additionalTitle}`, description: '次世代フロントエンドツール', head: [ ['link', { rel: 'icon', type: 'image/svg+xml', href: '/logo.svg' }], + [ + 'link', + { rel: 'alternate', type: 'application/rss+xml', href: '/blog.rss' }, + ], + ['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }], + [ + 'link', + { + rel: 'preconnect', + href: 'https://fonts.gstatic.com', + crossorigin: 'true', + }, + ], + [ + 'link', + { + rel: 'preload', + href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Manrope:wght@600&family=IBM+Plex+Mono:wght@400&display=swap', + as: 'style', + }, + ], + [ + 'link', + { + rel: 'stylesheet', + href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Manrope:wght@600&family=IBM+Plex+Mono:wght@400&display=swap', + }, + ], + inlineScript('banner.js'), + ['link', { rel: 'me', href: 'https://m.webtoo.ls/@vite' }], ['meta', { property: 'og:type', content: 'website' }], ['meta', { property: 'og:title', content: ogTitle }], ['meta', { property: 'og:image', content: ogImage }], ['meta', { property: 'og:url', content: ogUrl }], ['meta', { property: 'og:description', content: ogDescription }], + ['meta', { property: 'og:site_name', content: 'vitejs' }], ['meta', { name: 'twitter:card', content: 'summary_large_image' }], ['meta', { name: 'twitter:site', content: '@vite_js' }], ['meta', { name: 'theme-color', content: '#646cff' }], @@ -86,8 +147,15 @@ export default defineConfig({ ], ], - vue: { - reactivityTransform: true, + locales: { + root: { label: '日本語' }, + en: { label: 'English', link: 'https://vite.dev' }, + zh: { label: '简体中文', link: 'https://cn.vite.dev' }, + es: { label: 'Español', link: 'https://es.vite.dev' }, + pt: { label: 'Português', link: 'https://pt.vite.dev' }, + ko: { label: '한국어', link: 'https://ko.vite.dev' }, + de: { label: 'Deutsch', link: 'https://de.vite.dev' }, + fa: { label: 'فارسی', link: 'https://fa.vite.dev' }, }, themeConfig: { @@ -99,14 +167,16 @@ export default defineConfig({ }, socialLinks: [ - { icon: 'twitter', link: 'https://twitter.com/vite_js' }, - { icon: 'discord', link: 'https://chat.vitejs.dev' }, + { icon: 'bluesky', link: 'https://bsky.app/profile/vite.dev' }, + { icon: 'mastodon', link: 'https://elk.zone/m.webtoo.ls/@vite' }, + { icon: 'x', link: 'https://x.com/vite_js' }, + { icon: 'discord', link: 'https://chat.vite.dev' }, { icon: 'github', link: 'https://github.com/vitejs/vite' }, ], algolia: { appId: '7H67QR5P0A', - apiKey: 'deaab78bcdfe96b599497d25acc6460e', + apiKey: '208bb9c14574939326032b937431014b', indexName: 'vitejs', searchParameters: { facetFilters: ['tags:en'], @@ -118,18 +188,16 @@ export default defineConfig({ placement: 'vitejsdev', }, - localeLinks: { - text: '日本語', - items: [ - { text: 'English', link: 'https://vitejs.dev' }, - { text: '简体中文', link: 'https://cn.vitejs.dev' }, - { text: 'Español', link: 'https://es.vitejs.dev' }, - ], + outlineTitle: '目次', + + docFooter: { + prev: '前のページ', + next: '次のページ', }, footer: { message: `Released under the MIT License. (${commitRef})`, - copyright: 'Copyright © 2019-present Evan You & Vite Contributors', + copyright: 'Copyright © 2019-present VoidZero Inc. & Vite Contributors', }, nav: [ @@ -140,38 +208,52 @@ export default defineConfig({ text: 'リソース', items: [ { text: 'チーム', link: '/team' }, + { text: 'ブログ', link: '/blog' }, + { text: 'リリース', link: '/releases' }, { items: [ { - text: 'Twitter', - link: 'https://twitter.com/vite_js', + text: 'Bluesky', + link: 'https://bsky.app/profile/vite.dev', + }, + { + text: 'Mastodon', + link: 'https://elk.zone/m.webtoo.ls/@vite', + }, + { + text: 'X', + link: 'https://x.com/vite_js', }, { text: 'Discord Chat', - link: 'https://chat.vitejs.dev', + link: 'https://chat.vite.dev', }, { text: 'Awesome Vite', link: 'https://github.com/vitejs/awesome-vite', }, + { + text: 'ViteConf', + link: 'https://viteconf.org', + }, { text: 'DEV Community', link: 'https://dev.to/t/vite', }, { - text: 'Rollup Plugins Compat', - link: 'https://vite-rollup-plugins.patak.dev/', + text: '変更履歴', + link: 'https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md', }, { - text: 'Changelog', - link: 'https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md', + text: '貢献ガイド', + link: 'https://github.com/vitejs/docs-ja/blob/main/CONTRIBUTING.md', }, ], }, ], }, { - text: 'Version', + text: 'バージョン', items: versionLinks, }, ], @@ -179,16 +261,25 @@ export default defineConfig({ sidebar: { '/guide/': [ { - text: 'ガイド', + text: 'イントロダクション', items: [ - { - text: 'なぜ Vite なのか', - link: '/guide/why', - }, { text: 'はじめに', link: '/guide/', }, + { + text: '理念', + link: '/guide/philosophy', + }, + { + text: 'Vite を使う理由', + link: '/guide/why', + }, + ], + }, + { + text: 'ガイド', + items: [ { text: '特徴', link: '/guide/features', @@ -222,25 +313,33 @@ export default defineConfig({ link: '/guide/env-and-mode', }, { - text: 'サーバサイドレンダリング', + text: 'サーバーサイドレンダリング', link: '/guide/ssr', }, { text: 'バックエンドとの統合', link: '/guide/backend-integration', }, - { - text: '他のツールとの比較', - link: '/guide/comparisons', - }, { text: 'トラブルシューティング', link: '/guide/troubleshooting', }, { - text: 'v3 からの移行', + text: 'パフォーマンス', + link: '/guide/performance', + }, + { + text: 'Rolldown', + link: '/guide/rolldown', + }, + { + text: 'v6 からの移行', link: '/guide/migration', }, + { + text: '破壊的変更', + link: '/changes/', + }, ], }, { @@ -264,6 +363,31 @@ export default defineConfig({ }, ], }, + { + text: 'Environment API', + items: [ + { + text: 'はじめに', + link: '/guide/api-environment', + }, + { + text: '環境インスタンス', + link: '/guide/api-environment-instances', + }, + { + text: 'プラグイン', + link: '/guide/api-environment-plugins', + }, + { + text: 'フレームワーク', + link: '/guide/api-environment-frameworks', + }, + { + text: 'ランタイム', + link: '/guide/api-environment-runtimes', + }, + ], + }, ], '/config/': [ { @@ -278,7 +402,7 @@ export default defineConfig({ link: '/config/shared-options', }, { - text: 'サーバオプション', + text: 'サーバーオプション', link: '/config/server-options', }, { @@ -298,12 +422,96 @@ export default defineConfig({ link: '/config/ssr-options', }, { - text: 'ワーカのオプション', + text: 'ワーカーのオプション', link: '/config/worker-options', }, ], }, ], + '/changes/': [ + { + text: '破壊的変更', + link: '/changes/', + }, + { + text: '現在', + items: [], + }, + { + text: '将来', + items: [ + { + text: 'フック内の this.environment', + link: '/changes/this-environment-in-hooks', + }, + { + text: 'HMR hotUpdate プラグインフック', + link: '/changes/hotupdate-hook', + }, + { + text: '環境ごとの API への移行', + link: '/changes/per-environment-apis', + }, + { + text: 'ModuleRunner API を使った SSR', + link: '/changes/ssr-using-modulerunner', + }, + { + text: 'ビルド時の共有プラグイン', + link: '/changes/shared-plugins-during-build', + }, + ], + }, + { + text: '過去', + items: [], + }, + ], + }, + + outline: { + level: [2, 3], + }, + }, + transformPageData(pageData) { + const canonicalUrl = `${ogUrl}/${pageData.relativePath}` + .replace(/\/index\.md$/, '/') + .replace(/\.md$/, '') + pageData.frontmatter.head ??= [] + pageData.frontmatter.head.unshift( + ['link', { rel: 'canonical', href: canonicalUrl }], + ['meta', { property: 'og:title', content: pageData.title }], + ) + return pageData + }, + markdown: { + // languages used for twoslash and jsdocs in twoslash + languages: ['ts', 'js', 'json'], + codeTransformers: [transformerTwoslash()], + config(md) { + md.use(groupIconMdPlugin) + md.use(markdownItImageSize, { + publicDir: path.resolve(import.meta.dirname, '../public'), + }) + }, + }, + vite: { + plugins: [ + groupIconVitePlugin({ + customIcon: { + firebase: 'vscode-icons:file-type-firebase', + '.gitlab-ci.yml': 'vscode-icons:file-type-gitlab', + }, + }), + ], + optimizeDeps: { + include: [ + '@shikijs/vitepress-twoslash/client', + 'gsap', + 'gsap/dist/ScrollTrigger', + 'gsap/dist/MotionPathPlugin', + ], }, }, + buildEnd, }) diff --git a/.vitepress/inlined-scripts/banner.d.ts b/.vitepress/inlined-scripts/banner.d.ts new file mode 100644 index 00000000..db0d613f --- /dev/null +++ b/.vitepress/inlined-scripts/banner.d.ts @@ -0,0 +1,3 @@ +interface Window { + __VITE_BANNER_ID__: string +} \ No newline at end of file diff --git a/.vitepress/inlined-scripts/banner.js b/.vitepress/inlined-scripts/banner.js new file mode 100644 index 00000000..dc24e5d0 --- /dev/null +++ b/.vitepress/inlined-scripts/banner.js @@ -0,0 +1,11 @@ +;(() => { + const restore = (key, cls, def = false) => { + const saved = localStorage.getItem(key) + if (saved ? saved !== 'false' : def) { + document.documentElement.classList.add(cls) + } + } + + window.__VITE_BANNER_ID__ = 'viteconf2025' + restore(`vite-docs-banner-${__VITE_BANNER_ID__}`, 'banner-dismissed') +})() diff --git a/.vitepress/theme/components/AsideSponsors.vue b/.vitepress/theme/components/AsideSponsors.vue index 90e6adda..260cfa5b 100644 --- a/.vitepress/theme/components/AsideSponsors.vue +++ b/.vitepress/theme/components/AsideSponsors.vue @@ -1,22 +1,93 @@ + + diff --git a/.vitepress/theme/components/BlogIndex.vue b/.vitepress/theme/components/BlogIndex.vue new file mode 100644 index 00000000..5f77ee19 --- /dev/null +++ b/.vitepress/theme/components/BlogIndex.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/.vitepress/theme/components/HomeSponsors.vue b/.vitepress/theme/components/HomeSponsors.vue deleted file mode 100644 index 1378326e..00000000 --- a/.vitepress/theme/components/HomeSponsors.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/.vitepress/theme/components/NonInheritBadge.vue b/.vitepress/theme/components/NonInheritBadge.vue new file mode 100644 index 00000000..34c4c0fb --- /dev/null +++ b/.vitepress/theme/components/NonInheritBadge.vue @@ -0,0 +1,8 @@ + diff --git a/.vitepress/theme/components/SponsorBanner.vue b/.vitepress/theme/components/SponsorBanner.vue new file mode 100644 index 00000000..85e9c24a --- /dev/null +++ b/.vitepress/theme/components/SponsorBanner.vue @@ -0,0 +1,265 @@ + + + + + + + diff --git a/.vitepress/theme/components/YouTubeVideo.vue b/.vitepress/theme/components/YouTubeVideo.vue new file mode 100644 index 00000000..59f05d56 --- /dev/null +++ b/.vitepress/theme/components/YouTubeVideo.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/.vitepress/theme/components/landing/1. hero-section/HeroDiagram.vue b/.vitepress/theme/components/landing/1. hero-section/HeroDiagram.vue new file mode 100644 index 00000000..4813d14f --- /dev/null +++ b/.vitepress/theme/components/landing/1. hero-section/HeroDiagram.vue @@ -0,0 +1,841 @@ + + + + + diff --git a/.vitepress/theme/components/landing/1. hero-section/HeroSection.vue b/.vitepress/theme/components/landing/1. hero-section/HeroSection.vue new file mode 100644 index 00000000..def941cf --- /dev/null +++ b/.vitepress/theme/components/landing/1. hero-section/HeroSection.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/.vitepress/theme/components/landing/1. hero-section/github.svg b/.vitepress/theme/components/landing/1. hero-section/github.svg new file mode 100644 index 00000000..a1e44f33 --- /dev/null +++ b/.vitepress/theme/components/landing/1. hero-section/github.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgBlueIndicator.vue b/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgBlueIndicator.vue new file mode 100644 index 00000000..6f5854f7 --- /dev/null +++ b/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgBlueIndicator.vue @@ -0,0 +1,242 @@ + + + + + diff --git a/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgInputs.vue b/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgInputs.vue new file mode 100644 index 00000000..5f15a361 --- /dev/null +++ b/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgInputs.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgOutputs.vue b/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgOutputs.vue new file mode 100644 index 00000000..4b44fe6c --- /dev/null +++ b/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgOutputs.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgPinkIndicator.vue b/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgPinkIndicator.vue new file mode 100644 index 00000000..063816b6 --- /dev/null +++ b/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgPinkIndicator.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/FeatureCI.vue b/.vitepress/theme/components/landing/2. feature-section/FeatureCI.vue new file mode 100644 index 00000000..2d22fd68 --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/FeatureCI.vue @@ -0,0 +1,503 @@ + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/FeatureFlexiblePlugins.vue b/.vitepress/theme/components/landing/2. feature-section/FeatureFlexiblePlugins.vue new file mode 100644 index 00000000..b79251b4 --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/FeatureFlexiblePlugins.vue @@ -0,0 +1,557 @@ + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/FeatureHMR.vue b/.vitepress/theme/components/landing/2. feature-section/FeatureHMR.vue new file mode 100644 index 00000000..f30c224c --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/FeatureHMR.vue @@ -0,0 +1,515 @@ + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/FeatureInstantServerStart.vue b/.vitepress/theme/components/landing/2. feature-section/FeatureInstantServerStart.vue new file mode 100644 index 00000000..8329e453 --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/FeatureInstantServerStart.vue @@ -0,0 +1,427 @@ + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/FeatureOptimizedBuild.vue b/.vitepress/theme/components/landing/2. feature-section/FeatureOptimizedBuild.vue new file mode 100644 index 00000000..c249bc1a --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/FeatureOptimizedBuild.vue @@ -0,0 +1,623 @@ + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/FeatureRichFeatures.vue b/.vitepress/theme/components/landing/2. feature-section/FeatureRichFeatures.vue new file mode 100644 index 00000000..cb1df392 --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/FeatureRichFeatures.vue @@ -0,0 +1,280 @@ + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/FeatureSSRSupport.vue b/.vitepress/theme/components/landing/2. feature-section/FeatureSSRSupport.vue new file mode 100644 index 00000000..f5a6acf2 --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/FeatureSSRSupport.vue @@ -0,0 +1,540 @@ + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/FeatureSection.vue b/.vitepress/theme/components/landing/2. feature-section/FeatureSection.vue new file mode 100644 index 00000000..9aae7a15 --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/FeatureSection.vue @@ -0,0 +1,320 @@ + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/FeatureTypedAPI.vue b/.vitepress/theme/components/landing/2. feature-section/FeatureTypedAPI.vue new file mode 100644 index 00000000..83c2e3c7 --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/FeatureTypedAPI.vue @@ -0,0 +1,240 @@ + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/images/css3.svg b/.vitepress/theme/components/landing/2. feature-section/images/css3.svg new file mode 100644 index 00000000..afa66d98 --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/images/css3.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/images/js.svg b/.vitepress/theme/components/landing/2. feature-section/images/js.svg new file mode 100644 index 00000000..59a03751 --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/images/js.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/images/json.svg b/.vitepress/theme/components/landing/2. feature-section/images/json.svg new file mode 100644 index 00000000..20d86ed7 --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/images/json.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/images/postcss.svg b/.vitepress/theme/components/landing/2. feature-section/images/postcss.svg new file mode 100644 index 00000000..5251081b --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/images/postcss.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/images/ts.svg b/.vitepress/theme/components/landing/2. feature-section/images/ts.svg new file mode 100644 index 00000000..223587b2 --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/images/ts.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/2. feature-section/images/wa.svg b/.vitepress/theme/components/landing/2. feature-section/images/wa.svg new file mode 100644 index 00000000..8e6f976d --- /dev/null +++ b/.vitepress/theme/components/landing/2. feature-section/images/wa.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/FrameworkCard.vue b/.vitepress/theme/components/landing/3. frameworks-section/FrameworkCard.vue new file mode 100644 index 00000000..ecb8a826 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/FrameworkCard.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/FrameworksSection.vue b/.vitepress/theme/components/landing/3. frameworks-section/FrameworksSection.vue new file mode 100644 index 00000000..c9ab9c57 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/FrameworksSection.vue @@ -0,0 +1,472 @@ + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/adonis.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/adonis.svg new file mode 100644 index 00000000..0808286a --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/adonis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/analog.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/analog.svg new file mode 100644 index 00000000..2e7fe7d6 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/analog.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/angular.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/angular.svg new file mode 100644 index 00000000..b6eb20ab --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/angular.svg @@ -0,0 +1 @@ + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/astro.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/astro.svg new file mode 100644 index 00000000..744c7e9f --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/astro.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/ember.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/ember.svg new file mode 100644 index 00000000..4f1e6889 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/ember.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/hono.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/hono.svg new file mode 100644 index 00000000..9c7a84b5 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/hono.svg @@ -0,0 +1,4 @@ + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/laravel.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/laravel.svg new file mode 100644 index 00000000..a8d8fb19 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/laravel.svg @@ -0,0 +1 @@ + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/marko.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/marko.svg new file mode 100644 index 00000000..44c26273 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/marko.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/nuxt.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/nuxt.svg new file mode 100644 index 00000000..fb2de2c6 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/nuxt.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/playwright.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/playwright.svg new file mode 100644 index 00000000..63ef7c4c --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/playwright.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/preact.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/preact.svg new file mode 100644 index 00000000..246a3b22 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/preact.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/qwik.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/qwik.svg new file mode 100644 index 00000000..606a2b7c --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/qwik.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/react.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/react.svg new file mode 100644 index 00000000..c4fcecce --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/react.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/redwood.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/redwood.svg new file mode 100644 index 00000000..2d611735 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/redwood.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/remix.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/remix.svg new file mode 100644 index 00000000..a9457061 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/remix.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/solid.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/solid.svg new file mode 100644 index 00000000..1cf619e5 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/solid.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/storybook.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/storybook.svg new file mode 100644 index 00000000..43176b92 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/storybook.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/svelte.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/svelte.svg new file mode 100644 index 00000000..62309a1d --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/svelte.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/vitest.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/vitest.svg new file mode 100644 index 00000000..c9d5fd3e --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/vitest.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/3. frameworks-section/images/vue.svg b/.vitepress/theme/components/landing/3. frameworks-section/images/vue.svg new file mode 100644 index 00000000..b29e1a42 --- /dev/null +++ b/.vitepress/theme/components/landing/3. frameworks-section/images/vue.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/4. community-section/CommunityCard.vue b/.vitepress/theme/components/landing/4. community-section/CommunityCard.vue new file mode 100644 index 00000000..f897b015 --- /dev/null +++ b/.vitepress/theme/components/landing/4. community-section/CommunityCard.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/.vitepress/theme/components/landing/4. community-section/CommunitySection.vue b/.vitepress/theme/components/landing/4. community-section/CommunitySection.vue new file mode 100644 index 00000000..6e07b111 --- /dev/null +++ b/.vitepress/theme/components/landing/4. community-section/CommunitySection.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/.vitepress/theme/components/landing/5. sponsor-section/SponsorSection.vue b/.vitepress/theme/components/landing/5. sponsor-section/SponsorSection.vue new file mode 100644 index 00000000..2f9769e1 --- /dev/null +++ b/.vitepress/theme/components/landing/5. sponsor-section/SponsorSection.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/.vitepress/theme/components/landing/5. sponsor-section/heart.svg b/.vitepress/theme/components/landing/5. sponsor-section/heart.svg new file mode 100644 index 00000000..142e518c --- /dev/null +++ b/.vitepress/theme/components/landing/5. sponsor-section/heart.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.vitepress/theme/components/landing/6. get-started-section/GetStartedSection.vue b/.vitepress/theme/components/landing/6. get-started-section/GetStartedSection.vue new file mode 100644 index 00000000..dae39c8b --- /dev/null +++ b/.vitepress/theme/components/landing/6. get-started-section/GetStartedSection.vue @@ -0,0 +1,292 @@ + + + diff --git a/.vitepress/theme/components/landing/common/SvgNode.vue b/.vitepress/theme/components/landing/common/SvgNode.vue new file mode 100644 index 00000000..89214bbb --- /dev/null +++ b/.vitepress/theme/components/landing/common/SvgNode.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/.vitepress/theme/components/landing/common/noise.webp b/.vitepress/theme/components/landing/common/noise.webp new file mode 100644 index 00000000..8143a993 Binary files /dev/null and b/.vitepress/theme/components/landing/common/noise.webp differ diff --git a/.vitepress/theme/composables/images/astro.svg b/.vitepress/theme/composables/images/astro.svg new file mode 100644 index 00000000..079378b2 --- /dev/null +++ b/.vitepress/theme/composables/images/astro.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.vitepress/theme/composables/images/bolt.svg b/.vitepress/theme/composables/images/bolt.svg new file mode 100644 index 00000000..d7e24ff1 --- /dev/null +++ b/.vitepress/theme/composables/images/bolt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.vitepress/theme/composables/images/nuxtlabs.svg b/.vitepress/theme/composables/images/nuxtlabs.svg new file mode 100644 index 00000000..d2935645 --- /dev/null +++ b/.vitepress/theme/composables/images/nuxtlabs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.vitepress/theme/composables/images/stackblitz.svg b/.vitepress/theme/composables/images/stackblitz.svg new file mode 100644 index 00000000..a16fcd92 --- /dev/null +++ b/.vitepress/theme/composables/images/stackblitz.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.vitepress/theme/composables/images/voidzero.svg b/.vitepress/theme/composables/images/voidzero.svg new file mode 100644 index 00000000..d26cefa3 --- /dev/null +++ b/.vitepress/theme/composables/images/voidzero.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/.vitepress/theme/composables/sponsor.ts b/.vitepress/theme/composables/sponsor.ts index 976dbcfb..b7f37ed9 100644 --- a/.vitepress/theme/composables/sponsor.ts +++ b/.vitepress/theme/composables/sponsor.ts @@ -1,4 +1,7 @@ -import { ref, onMounted } from 'vue' +import { onMounted, onUnmounted, ref } from 'vue' +import voidZeroSvg from './images/voidzero.svg' +import boltSvg from './images/bolt.svg' +import nuxtLabsSvg from './images/nuxtlabs.svg' interface Sponsors { special: Sponsor[] @@ -13,16 +16,73 @@ interface Sponsor { name: string img: string url: string + /** + * Expects to also have an **inversed** image with `-dark` postfix. + */ + hasDark?: true } // shared data across instances so we load only once. -const data = ref() +const data = ref<{ tier: string; size: string; items: Sponsor[] }[]>() const dataHost = 'https://sponsors.vuejs.org' const dataUrl = `${dataHost}/vite.json` +export const voidZero = { + name: 'VoidZero', + url: 'https://voidzero.dev', + img: voidZeroSvg, +} satisfies Sponsor + +const viteSponsors: Pick = { + special: [ + // sponsors patak-dev + { + name: 'Bolt', + url: 'https://bolt.new', + img: boltSvg, + }, + // sponsors antfu + { + name: 'NuxtLabs', + url: 'https://nuxtlabs.com', + img: nuxtLabsSvg, + }, + ], + gold: [ + // now automated via sponsors.vuejs.org too + ], +} + +function toggleDarkLogos() { + if (data.value) { + const isDark = document.documentElement.classList.contains('dark') + data.value.forEach(({ items }) => { + items.forEach((s: Sponsor) => { + if (s.hasDark) { + s.img = isDark + ? s.img.replace(/(\.\w+)$/, '-dark$1') + : s.img.replace(/-dark(\.\w+)$/, '$1') + } + }) + }) + } +} + export function useSponsor() { onMounted(async () => { + const ob = new MutationObserver((list) => { + for (const m of list) { + if (m.attributeName === 'class') { + toggleDarkLogos() + } + } + }) + ob.observe(document.documentElement, { attributes: true }) + onUnmounted(() => { + ob.disconnect() + }) + if (data.value) { return } @@ -31,6 +91,7 @@ export function useSponsor() { const json = await result.json() data.value = mapSponsors(json) + toggleDarkLogos() }) return { @@ -41,21 +102,37 @@ export function useSponsor() { function mapSponsors(sponsors: Sponsors) { return [ { - tier: 'Platinum Sponsor', + tier: 'パートナーシップ', + size: 'big', + items: viteSponsors['special'], + }, + { + tier: 'プラチナスポンサー', size: 'big', items: mapImgPath(sponsors['platinum']), }, { - tier: 'Gold Sponsors', + tier: 'ゴールドスポンサー', size: 'medium', - items: mapImgPath(sponsors['gold']), + items: [...mapImgPath(sponsors['gold']), ...viteSponsors['gold']], }, ] } +const viteSponsorNames = new Set( + Object.values(viteSponsors).flatMap((sponsors) => + sponsors.map((s) => s.name), + ), +) + +/** + * Map Vue/Vite sponsors data to objects and filter out Vite-specific sponsors + */ function mapImgPath(sponsors: Sponsor[]) { - return sponsors.map((sponsor) => ({ - ...sponsor, - img: `${dataHost}/images/${sponsor.img}`, - })) + return sponsors + .filter((sponsor) => !viteSponsorNames.has(sponsor.name)) + .map((sponsor) => ({ + ...sponsor, + img: `${dataHost}/images/${sponsor.img}`, + })) } diff --git a/.vitepress/theme/composables/useCardAnimation.ts b/.vitepress/theme/composables/useCardAnimation.ts new file mode 100644 index 00000000..13e1f6a8 --- /dev/null +++ b/.vitepress/theme/composables/useCardAnimation.ts @@ -0,0 +1,107 @@ +import { type Ref, onMounted, onUnmounted, ref } from 'vue' +import { gsap } from 'gsap' +import { ScrollTrigger } from 'gsap/dist/ScrollTrigger' + +gsap.registerPlugin(ScrollTrigger) + +/** + * A custom hook for animating a card element. + * + * @param {HTMLElement | string} el - The element or selector for the element to be animated + * @param {() => GSAPTimeline} animation - A function that returns a GSAP timeline for the animation + * @param {object} options - Options for the animation + */ +export function useCardAnimation( + el: HTMLElement | string, + animation: (() => GSAPTimeline) | undefined = undefined, + options?: { + /** + * A flag to indicate whether the animation should only run once, and not reset once complete. + */ + once?: boolean + }, +) { + /** + * The GSAP timeline for this animation. + */ + let timeline: GSAPTimeline | null + + /** + * A flag to indicate whether the card is currently active or not. + * May be inactive while the animation is still finishing up, due to CSS transitions. + */ + const isCardActive: Ref = ref(false) + + /** + * An internal flag to prevent multiple animations from running at the same time. + */ + const isAnimationRunning: Ref = ref(false) + + /** + * Starts the card's animation, managing the lifecycle internally to prevent multiple animations from running at the same time. + */ + const startAnimation = () => { + if (isAnimationRunning.value) { + return + } else { + isAnimationRunning.value = true + isCardActive.value = true + } + if (timeline) { + timeline.kill() + } + if (!animation) { + return + } + timeline = gsap.timeline({ + onComplete: () => { + if (!options?.once) { + isCardActive.value = false + setTimeout(() => { + isAnimationRunning.value = false + }, 3000) + } + }, + }) + timeline.add(animation()) + } + + /** + * The ScrollTrigger instance for this card. + */ + let scrollTriggerInstance: ScrollTrigger | null = null + + /** + * Trigger's the card's animation automatically on mobile devices (no hover method) + */ + onMounted(() => { + if (window.innerWidth < 768) { + scrollTriggerInstance = ScrollTrigger.create({ + trigger: el, + start: 'top 60%', + onEnter: () => { + startAnimation() + }, + }) + } + }) + + /** + * Remove the ScrollTrigger and GSAP timeline instances when the component is unmounted + */ + onUnmounted(() => { + if (scrollTriggerInstance) { + scrollTriggerInstance.kill() + scrollTriggerInstance = null + } + if (timeline) { + timeline.kill() + timeline = null + } + }) + + return { + startAnimation, + isCardActive, + } +} diff --git a/.vitepress/theme/composables/useSlideIn.ts b/.vitepress/theme/composables/useSlideIn.ts new file mode 100644 index 00000000..e41cd898 --- /dev/null +++ b/.vitepress/theme/composables/useSlideIn.ts @@ -0,0 +1,19 @@ +import { nextTick, onMounted } from 'vue' +import { gsap } from 'gsap' + +export function useSlideIn(el: HTMLElement | string) { + onMounted(async () => { + await nextTick(() => { + gsap.to(el, { + x: 0, + duration: 1, + ease: 'power3.out', + scrollTrigger: { + trigger: el, + start: 'top 100%', + once: true, + }, + }) + }) + }) +} diff --git a/.vitepress/theme/index.ts b/.vitepress/theme/index.ts index bef729b7..6f81f73e 100644 --- a/.vitepress/theme/index.ts +++ b/.vitepress/theme/index.ts @@ -1,19 +1,29 @@ import { h } from 'vue' -import Theme from 'vitepress/theme' +import type { Theme } from 'vitepress' +import DefaultTheme from 'vitepress/theme' +import TwoslashFloatingVue from '@shikijs/vitepress-twoslash/client' +import '@shikijs/vitepress-twoslash/style.css' import './styles/vars.css' -import HomeSponsors from './components/HomeSponsors.vue' +import './styles/landing.css' import AsideSponsors from './components/AsideSponsors.vue' import SvgImage from './components/SvgImage.vue' +import YouTubeVideo from './components/YouTubeVideo.vue' +import SponsorBanner from './components/SponsorBanner.vue' +import NonInheritBadge from './components/NonInheritBadge.vue' +import 'virtual:group-icons.css' export default { - ...Theme, + extends: DefaultTheme, Layout() { - return h(Theme.Layout, null, { - 'home-features-after': () => h(HomeSponsors), + return h(DefaultTheme.Layout, null, { + 'layout-top': () => h(SponsorBanner), 'aside-ads-before': () => h(AsideSponsors), }) }, enhanceApp({ app }) { app.component('SvgImage', SvgImage) + app.component('YouTubeVideo', YouTubeVideo) + app.component('NonInheritBadge', NonInheritBadge) + app.use(TwoslashFloatingVue) }, -} +} satisfies Theme diff --git a/.vitepress/theme/styles/landing.css b/.vitepress/theme/styles/landing.css new file mode 100644 index 00000000..8dc44bc3 --- /dev/null +++ b/.vitepress/theme/styles/landing.css @@ -0,0 +1,224 @@ +/* /////////////////////// */ +/* Landing Page CSS Styles */ +/* /////////////////////// */ + +html:has(.landing) { + --vp-c-bg: #101010; + background-color: #101010; +} + +.landing { + overflow-x: hidden; + + * { + -webkit-font-smoothing: antialiased !important; + -moz-osx-font-smoothing: grayscale !important; + text-rendering: optimizeLegibility !important; + } + + /* /////////////////// */ + /* VitePress Overrides */ + /* /////////////////// */ + + .VPNavBar, + .VPNavBar:not(.top) { + background: transparent !important; + + @media (min-width: 768px) { + backdrop-filter: blur(10px); + background: rgba(15, 15, 15, 0.8) !important; + border-bottom: 1px solid #262626 !important; + } + + .content-body { + background: none !important; + transition: none; + } + } + + .VPNavBar *:not(.wrapper *) { + transition: none; + } + + .VPFooter { + border-top: 1px solid #262626 !important; + background: radial-gradient(circle at top center, #0f151a 30%, #000000 80%); + } + + .VPHome { + padding-bottom: 0 !important; + margin-bottom: 0 !important; + } + + /* /////////////// */ + /* Force Dark Mode */ + /* /////////////// */ + + .VPNavBarAppearance { + display: none; + } + + .VPMenu .translations + .group { + display: none; + } + + .VPNavScreenAppearance { + visibility: hidden; + } + + .social-links::before { + margin-left: 0 !important; + } + + /* ////////// */ + /* Typography */ + /* ////////// */ + + h1 { + text-align: center; + font-family: 'Manrope', sans-serif; + font-style: normal; + font-weight: 600; + background: linear-gradient( + 180deg, + #fff 0%, + rgba(255, 255, 255, 0.31) 100% + ); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + text-wrap: balance; + cursor: default; + font-size: 44px; + line-height: 120%; + letter-spacing: -0.88px; + padding: 0 20px; + margin-bottom: 15px; + + @media (min-width: 768px) { + font-size: 64px; + line-height: 81px; + letter-spacing: -1.28px; + } + + @media (min-width: 1025px) { + font-size: 72px; + letter-spacing: -1.44px; + padding-bottom: 8px; /* Fix for hanging descender on "g" in "tooling" */ + } + } + + h2 { + display: block; + width: fit-content; + font-family: Manrope, sans-serif; + font-size: 32px; + font-style: normal; + font-weight: 600; + line-height: 120%; + letter-spacing: -0.64px; + cursor: default; + text-wrap: balance; + padding: 0 20px; + + @media (min-width: 768px) { + font-size: 44px; + letter-spacing: -0.88px; + } + } + + h3 { + color: #a9a9a9; + text-align: center; + font-family: Inter, sans-serif; + font-size: 19px; /* 日本語版: 元は 20px */ + font-style: normal; + font-weight: 400; + line-height: 150%; + letter-spacing: -0.4px; + max-width: 500px; + text-wrap: balance; + cursor: default; + margin-bottom: 25px; + padding: 0 20px; + } + + /* /////// */ + /* Buttons */ + /* /////// */ + + .btn { + display: flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + color: #fff; + font-family: Inter, sans-serif; + font-size: 16px; + font-style: normal; + font-weight: 500; + line-height: 24px; + text-shadow: 0 0 2px rgba(0, 0, 0, 0.2); + transition: all 0.2s ease-in-out; + width: fit-content; + + &:hover { + transform: translate3d(0, -2px, 0); + } + + &.btn--primary { + position: relative; + background: + radial-gradient( + 141.42% 141.42% at 100% 0%, + rgba(255, 255, 255, 0.4) 0%, + rgba(255, 255, 255, 0) 100% + ), + radial-gradient( + 140.35% 140.35% at 100% 94.74%, + #bd34fe 0%, + rgba(189, 52, 254, 0) 100% + ), + radial-gradient( + 89.94% 89.94% at 18.42% 15.79%, + #41d1ff 0%, + rgba(65, 209, 255, 0) 100% + ); + box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.75) inset; + + &:hover { + background: + radial-gradient( + 141.42% 141.42% at 100% 0%, + rgba(255, 255, 255, 0.5) 0%, + rgba(255, 255, 255, 0) 100% + ), + radial-gradient( + 140.35% 140.35% at 100% 94.74%, + #bd34fe 0%, + rgba(189, 52, 254, 0) 100% + ), + radial-gradient( + 89.94% 89.94% at 18.42% 15.79%, + #41d1ff 0%, + rgba(65, 209, 255, 0) 100% + ); + box-shadow: 0 1.5px 0 0 rgba(255, 255, 255, 0.8) inset; + } + } + + &.btn--outline { + border: 1px solid rgba(255, 255, 255, 0.2); + + &:hover { + border: 1px solid rgba(255, 255, 255, 0.4); + } + } + + &.btn--rounded { + border-radius: 100px; + } + } +} diff --git a/.vitepress/theme/styles/vars.css b/.vitepress/theme/styles/vars.css index 7fa66469..9c73cf8f 100644 --- a/.vitepress/theme/styles/vars.css +++ b/.vitepress/theme/styles/vars.css @@ -2,7 +2,7 @@ * Colors * -------------------------------------------------------------------------- */ - :root { +:root { --vp-c-brand: #646cff; --vp-c-brand-light: #747bff; --vp-c-brand-lighter: #9499ff; @@ -18,53 +18,21 @@ :root { --vp-button-brand-border: var(--vp-c-brand-light); - --vp-button-brand-text: var(--vp-c-text-dark-1); + --vp-button-brand-text: var(--vp-c-white); --vp-button-brand-bg: var(--vp-c-brand); --vp-button-brand-hover-border: var(--vp-c-brand-light); - --vp-button-brand-hover-text: var(--vp-c-text-dark-1); + --vp-button-brand-hover-text: var(--vp-c-white); --vp-button-brand-hover-bg: var(--vp-c-brand-light); --vp-button-brand-active-border: var(--vp-c-brand-light); - --vp-button-brand-active-text: var(--vp-c-text-dark-1); + --vp-button-brand-active-text: var(--vp-c-white); --vp-button-brand-active-bg: var(--vp-button-brand-bg); } -/** - * Component: Home - * -------------------------------------------------------------------------- */ - -:root { - --vp-home-hero-name-color: transparent; - --vp-home-hero-name-background: -webkit-linear-gradient( - 120deg, - #bd34fe 30%, - #41d1ff - ); - - --vp-home-hero-image-background-image: linear-gradient( - -45deg, - #bd34fe 50%, - #47caff 50% - ); - --vp-home-hero-image-filter: blur(40px); -} - -@media (min-width: 640px) { - :root { - --vp-home-hero-image-filter: blur(56px); - } -} - -@media (min-width: 960px) { - :root { - --vp-home-hero-image-filter: blur(72px); - } -} - /** * Component: Custom Block * -------------------------------------------------------------------------- */ - :root { +:root { --vp-custom-block-tip-border: var(--vp-c-brand); --vp-custom-block-tip-text: var(--vp-c-brand-darker); --vp-custom-block-tip-bg: var(--vp-c-brand-dimm); @@ -82,6 +50,7 @@ .DocSearch { --docsearch-primary-color: var(--vp-c-brand) !important; + --docsearch-container-background: rgba(0, 0, 0, 0.7); } /** @@ -114,3 +83,23 @@ .dark .vp-doc .custom-block a { transition: color 0.25s; } + +.vp-sponsor.aside .vp-sponsor-grid.mini .vp-sponsor-grid-image { + max-width: 124px; +} + +.vp-sponsor-grid.big .vp-sponsor-grid-image { + max-height: 56px; +} + +.vp-sponsor-grid.mini .vp-sponsor-grid-image[alt='Bit'] { + max-height: 48px; +} + +.vp-sponsor-grid.xmini .vp-sponsor-grid-image[alt='JetBrains'] { + max-height: 54px; +} + +.vp-sponsor-grid.medium .vp-sponsor-grid-image[alt='JetBrains'] { + max-height: 100px; +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 88e94c14..ed268cff 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,31 +1,43 @@ # Vite 日本語翻訳ガイド -ようこそ、Vite 日本語翻訳レポジトリへ!翻訳プロジェクトに貢献したい方は以下の内容を一読の上、お願いします。 +ようこそ、Vite 日本語翻訳リポジトリーへ! +翻訳プロジェクトに貢献したい方は、以下の内容を一読の上、お願いします。 ## 貢献方法 -### GitHub Issues にある本家ドキュメントの差分更新内容を翻訳して貢献する +### GitHub Issues にある本家ドキュメントの差分更新 +英語版ドキュメントが更新されると、自動的に本リポジトリーにも issue が生成されるようになっています(説明文が `New updates on head repo.` となっているもの)。 -1. [GitHub Issues](https://github.com/vitejs/docs-ja/issues) の中でまだアサインされていない issues 一覧から自分のやりたい issue を選択します。 -2. 選択した issue で「翻訳やります!」のようなコメントで宣言します。(`vitejs/docs-ja` のメンテナの方々は、GitHub の assign 機能で self assign で OK です) -3. 本レポジトリ(`vitejs/docs-ja`)のメンテナの方から同 issue でコメントで承認されたら、正式自分が選んだ issue の翻訳担当者としてアサインされたことになります。 -4. このレポジトリをフォークします! -5. `main` から任意の名前のブランチを切って作業を開始しましょう! (`git checkout -b your-translate-branch`) -6. フォークした自分のレポジトリに Push します。(`git push origin your-translate-branch`) -7. 問題がなければ、プルリクエストを `vitejs/docs-ja` の `main` ブランチに送ります。 -8. レビュー 👀 で指摘事項があったら修正し、再度 Push します 📝 -9. レビュー 👀 で OK 🙆‍♀️ ならば、メンテナの方があなたのブランチをマージします🎉 +1. [GitHub Issues](https://github.com/vitejs/docs-ja/issues) から、[このクエリー](https://github.com/vitejs/docs-ja/issues?q=is%3Aissue+is%3Aopen+sort%3Acreated-asc+New+updates+on+head+repo.) でソート & フィルターして、アサインされていない issues 一覧からできるだけ古いものからやりたい issue を選択します +2. 選択した issue で、「対応します!」などのコメントで宣言します(`vitejs/docs-ja` のメンテナーの方々は、GitHub の assign 機能で self assign で OK です) +3. このリポジトリー `vitejs/docs-ja` のメンテナーから同 issue でリアクションされたら、自分が選んだ issue の担当者として正式にアサインされたことになります +4. このリポジトリーをフォークします! + - README に従い、必ずパッケージをインストールしてください(textlint のため) +5. `main` ブランチからトピックブランチを作成します: `git branch my-topic-branch main` +6. 変更をコミットします: `git commit -am 'docs: fix typo'` + - コミットメッセージは issue のタイトル(英語版のコミットメッセージ)と同じにしてください +7. textlint で引っかかる場合は再度修正を行いコミットします +8. フォークした自分のリポジトリーに Push します: `git push origin my-topic-branch` +9. 問題がなければ、プルリクエストを `vitejs/docs-ja` の `main` ブランチに送ります +10. レビューで指摘事項があったら修正 + Push し、再レビュー依頼(Reviewers の :arrows_counterclockwise: ボタン)します + - 依頼の前に、修正漏れがないか確認してください +11. レビューで OK ならば、マージされてドキュメントに反映されます :tada: +#### Tips: より円滑な Pull Request のコメント記載方法 -### Tips: より円滑な Pull Request のコメント記載方法 +GitHub の Pull Request には、特定の記法を Pull Request の本文に書くことによって、該当 Pull Request のマージ時に自動的に対応する Issues をクローズできる機能があります。 +Pull Request を送るときに、余裕があれば "resolve #123" といった形で、該当する Issues の番号を記載されているとレビュアーが非常に助かります :pray: -GitHub の Pull Request には、特定の記法を Pull Request の本文に書くことによって、該当 Pull Request のマージ時に自動的に対応する Issues をクローズできる機能があります。 Pull Request を送るときに、余裕があれば "resolve #123" といった形で、該当する Issues の番号を記載されているとレビュアが非常に助かります 🙏 詳しくは、[プルリクエストをIssueにリンクする - GitHub Docs](https://docs.github.com/ja/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue) を参照してください。 +### タイポなどの修正 + +手順は上記の `4.` 以降と同じです。 ## 翻訳スタイル -- [JTF 日本語標準スタイルガイド(翻訳用)](https://www.jtf.jp/tips/styleguide) に準拠 -- JTF 日本語標準スタイルのチェックツールは [textlint-plugin-JTF-style](https://github.com/azu/textlint-plugin-JTF-style) を使用し、ルールは Vue.js 公式サイト向けに [一部カスタマイズ](https://github.com/vitejs/docs-ja/blob/main/.textlintrc) - - `yarn test` コマンドを実行すると、Markdown ファイルに対して textlint を実行できます。 +- [JTF 日本語標準スタイルガイド(翻訳用)](https://www.jtf.jp/tips/styleguide) - 基本的な翻訳スタイル。 +- [Microsoft ローカリゼーション スタイル ガイド](https://www.microsoft.com/ja-jp/language/styleguides) - 技術文書におけるスタイル。 +- [textlint-rule-preset-JTF-style](https://github.com/textlint-ja/textlint-rule-preset-JTF-style) - JTF 日本語標準スタイルガイド(翻訳用)の textlint のルールセット。 +- [textlint-rule-preset-vuejs-jp](https://github.com/vuejs-jp/textlint-rule-preset-vuejs-jp) - Vue.js 日本ユーザーグループで一部カスタマイズした textlint のルールセット。 ## 翻訳のゆらぎ & トーン @@ -33,23 +45,27 @@ GitHub の Pull Request には、特定の記法を Pull Request の本文に書 「だである」ではなく「ですます」調 -> Vite (French word for "fast", pronounced `/vit/`) is a build tool that aims to provide a faster and leaner development experience for modern web projects. +> Vite (French word for "fast", pronounced `/vit/`) is a build tool that aims to provide a faster and leaner development experience for modern web projects. + - NG : Vite(フランス語で「速い」という意味の単語で `/vit/` と発音)は現代の Web プロジェクトのために、より速く無駄のない開発体験を提供することを目的としたビルドツール**である**。 + - OK : Vite(フランス語で「速い」という意味の単語で `/vit/` と発音)は現代の Web プロジェクトのために、より速く無駄のない開発体験を提供することを目的としたビルドツール**です**。 ### 半角スペースでアルファベット両端を入れて読みやすく! -> Vite (French word for "fast", pronounced `/vit/`) is a build tool that aims to provide a faster and leaner development experience for modern web projects. +> Vite (French word for "fast", pronounced `/vit/`) is a build tool that aims to provide a faster and leaner development experience for modern web projects. -- NG : Vite(フランス語で「速い」という意味の単語で`/vit/`と発音)は現代のWebプロジェクトのために、より速く無駄のない開発体験を提供することを目的としたビルドツールです。 + +- NG : Vite(フランス語で「速い」という意味の単語で`/vit/`と発音)は現代のWebプロジェクトのために、より速く無駄のない開発体験を提供することを目的としたビルドツールです。 + - OK : Vite(フランス語で「速い」という意味の単語で `/vit/` と発音)現代の Web プロジェクトのために、より速く無駄のない開発体験を提供することを目的としたビルドツールです。 例外として、句読点の前後にアルファベットがある場合は、スペースを入れなくてもいいです。 - 読点: お気づきかもしれませんが、Vite プロジェクトでは `index.html` は `public` 内に隠れているのではなく、最も目立つ場所にあります。 -### 原則、一語一句翻訳、ただ日本語として分かりにくい場合は読みやすさを優先 +### 原則、一語一句翻訳。ただし日本語として分かりにくい場合は読みやすさを優先 > Dependencies are Strongly Cached. @@ -63,7 +79,7 @@ GitHub の Pull Request には、特定の記法を Pull Request の本文に書 - NG: 例 - OK: 例: -ただし、文の途中にハイフン `-` やセミコロン `;` がある場合は、その記号があると理解しづらい訳になる場合は、例外として削除してもよいです。 +ただし、文の途中にハイフン `-` やセミコロン `;` があり、その記号があると理解しづらい訳になる場合は、例外として削除してもよいです。 - 原文: @@ -73,43 +89,27 @@ GitHub の Pull Request には、特定の記法を Pull Request の本文に書 > NPM の依存関係の解決と事前バンドル。 -### 単語の統一 (特に技術用語) +### 単語の統一(特に技術用語) - 技術用語は基本英語、ただ日本語で一般的に使われている場合は日本語 OK !! - - 例: 英語の filter 、日本語のフィルタ + - 例: 英語の filter 、日本語のフィルター - 和訳に困った、とりあえず英語 - 例: expression -> 式、表現 -- 和訳にして分かりづらい場合は、翻訳と英語(どちらかに括弧付け)でも OK - - 例: Two way -> Two way (双方向) - -### 長音訳のついて - -原則、**長音なし**で翻訳する。 - -- NG: コンピューター -- OK: コンピュータ - -ただし、長音なしで訳した場合、**意味が分かりにくいものは、例外として長音あり**で訳してもよいです。 - -> Pull Request flow - -- NG: プルリクエストフロ -- OK: プルリクエストフロー +- 和訳にして分かりづらい場合は、翻訳と英語(どちらかに括弧付け)でも OK + - 例: Two way -> Two way(双方向) -#### 長音訳例外リスト +### 長音訳について -> NOTE: 以下のリストは随時追加していく +原則、**長音あり**で翻訳する。 -- error: エラー -- throw: スロー -- flow: フロー -- ... +- NG: コンピュータ +- OK: コンピューター ## 注意事項 ### 行の追加・削除をしない -行番号が変わってしまうと Vite 本体の変更を取り込む際に対応箇所を探すのが難しいので、原文と同じ行に翻訳してください。 +行番号が変わってしまうと英語版ドキュメントの変更を取り込む際に対応箇所を探すのが難しくなるので、原文と同じ行に翻訳してください。 原文: @@ -142,16 +142,3 @@ OK: 行がそのまま 6 | 7 | 最も基本的な設定ファイルは次のようになります: ``` - -### Vite 本体との差分 Issue について - -以下の説明文の Issue は Vite 本体のリポジトリに変更があった際に自動的に作られるものです。 - -```text -New updates on head repo. -vitejs/vite@コミット番号 -``` - -これらに関しては `help wanted` タグなどが付いていなくても対応可能です。 -もし対応いただける場合は、古いものから順番にお願いします。 -(新しいものを先にやってしまうとデグレの可能性があるため) diff --git a/LICENSE b/LICENSE index 9c1b313d..b7e97ecb 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019-present, Yuxi (Evan) You and Vite contributors +Copyright (c) 2019-present, VoidZero Inc. and Vite contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 3bc337c1..d0605d2c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Vite Docs JA -[Vite ドキュメント](https://vitejs.dev)の日本語翻訳レポジトリです。現状、本レポジトリは翻訳作業用のものとして一時的に用意されています。将来的に、本レポジトリは別場所に移動される可能性があります。 +[Vite ドキュメント](https://vite.dev)の日本語翻訳リポジトリーです。現状、本リポジトリーは翻訳作業用のものとして一時的に用意されています。将来的に、本リポジトリーは別場所に移動される可能性があります。 ## 貢献ガイド [Vite 日本語翻訳ガイド](https://github.com/vitejs/docs-ja/blob/main/CONTRIBUTING.md) を一読お願いします! @@ -11,12 +11,11 @@ 本ドキュメントは [VitePress](https://vitepress.vuejs.org/) で作られています。ローカル環境で作業を行う場合は、以下のステップを踏んでください。 ```bash -# NPMパッケージをインストール -$ yarn install +# NPM パッケージをインストール +$ pnpm install -# ローカル Web サーバを起動 -$ yarn docs -``` +# ローカル Web サーバーを起動 +$ pnpm run docs +``` 上記コマンド実行後、`http://localhost:5173` にアクセスするとサイトにアクセスできます。 - diff --git a/_data/blog.data.ts b/_data/blog.data.ts new file mode 100644 index 00000000..48320ae0 --- /dev/null +++ b/_data/blog.data.ts @@ -0,0 +1,41 @@ +import { createContentLoader } from 'vitepress' + +interface Post { + title: string + url: string + date: { + time: number + string: string + } +} + +declare const data: Post[] +export { data } + +export default createContentLoader('blog/*.md', { + // excerpt: true, + transform(raw): Post[] { + return raw + .map(({ url, frontmatter }) => ({ + title: frontmatter.head.find( + (e: any) => e[1].property === 'og:title', + )[1].content, + url, + date: formatDate(frontmatter.date), + })) + .sort((a, b) => b.date.time - a.date.time) + }, +}) + +function formatDate(raw: string): Post['date'] { + const date = new Date(raw) + date.setUTCHours(12) + return { + time: +date, + string: date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric', + }), + } +} diff --git a/_data/team.js b/_data/team.js index 538757c9..7d8b1bf5 100644 --- a/_data/team.js +++ b/_data/team.js @@ -8,7 +8,8 @@ export const core = [ desc: 'Independent open source developer, creator of Vue.js and Vite.', links: [ { icon: 'github', link: 'https://github.com/yyx990803' }, - { icon: 'twitter', link: 'https://twitter.com/youyuxi' }, + { icon: 'x', link: 'https://x.com/youyuxi' }, + { icon: 'bluesky', link: 'https://bsky.app/profile/evanyou.me' }, ], sponsor: 'https://github.com/sponsors/yyx990803', }, @@ -21,7 +22,8 @@ export const core = [ desc: 'Core team member of Vite. Team member of Vue.', links: [ { icon: 'github', link: 'https://github.com/patak-dev' }, - { icon: 'twitter', link: 'https://twitter.com/patak_dev' }, + { icon: 'bluesky', link: 'https://bsky.app/profile/patak.dev' }, + { icon: 'mastodon', link: 'https://elk.zone/m.webtoo.ls/@patak' }, ], sponsor: 'https://github.com/sponsors/patak-dev', }, @@ -34,7 +36,8 @@ export const core = [ desc: 'Core team member of Vite & Vue. Working at NuxtLabs.', links: [ { icon: 'github', link: 'https://github.com/antfu' }, - { icon: 'twitter', link: 'https://twitter.com/antfu7' }, + { icon: 'bluesky', link: 'https://bsky.app/profile/antfu.me' }, + { icon: 'mastodon', link: 'https://elk.zone/m.webtoo.ls/@antfu' }, ], sponsor: 'https://github.com/sponsors/antfu', }, @@ -42,10 +45,12 @@ export const core = [ avatar: 'https://github.com/bluwy.png', name: 'Bjorn Lu', title: 'Open Source Developer', - desc: 'Astro core residency. Svelte and Vite core team member.', + desc: 'Building tools for fun.', links: [ { icon: 'github', link: 'https://github.com/bluwy' }, + { icon: 'bluesky', link: 'https://bsky.app/profile/bluwy.me' }, { icon: 'twitter', link: 'https://twitter.com/bluwyoo' }, + { icon: 'mastodon', link: 'https://elk.zone/m.webtoo.ls/@bluwy' }, ], sponsor: 'https://bjornlu.com/sponsor', }, @@ -53,39 +58,73 @@ export const core = [ avatar: 'https://github.com/sapphi-red.png', name: 'green', title: 'Web Developer', - desc: 'Vite team member. Call me sapphi or green or midori ;)', + desc: 'Vite core team member. Call me sapphi or green or midori ;)', links: [ { icon: 'github', link: 'https://github.com/sapphi-red' }, + { icon: 'bluesky', link: 'https://bsky.app/profile/sapphi.red' }, { icon: 'twitter', link: 'https://twitter.com/sapphi_red' }, + { icon: 'mastodon', link: 'https://elk.zone/m.webtoo.ls/@sapphi_red' }, ], sponsor: 'https://github.com/sponsors/sapphi-red', }, { - avatar: 'https://github.com/sodatea.png', - name: 'Haoqun Jiang', - title: 'Developer', - org: 'Vue.js', - orgLink: 'https://vuejs.org/', - desc: 'Vite/Vite core team member. Full-time open sourcerer.', + avatar: 'https://github.com/ArnaudBarre.png', + name: 'Arnaud Barré', + title: 'Frontend Developer', + desc: 'Passionate about tooling around TypeScript and React.', links: [ - { icon: 'github', link: 'https://github.com/sodatea' }, - { icon: 'twitter', link: 'https://twitter.com/haoqunjiang' }, + { icon: 'github', link: 'https://github.com/ArnaudBarre' }, + { + icon: 'bluesky', + link: 'https://bsky.app/profile/arnaud-barre.bsky.social', + }, + { icon: 'mastodon', link: 'https://elk.zone/m.webtoo.ls/@ArnaudBarre' }, ], - sponsor: 'https://github.com/sponsors/sodatea', + sponsor: 'https://github.com/sponsors/ArnaudBarre', }, { - avatar: 'https://github.com/Shinigami92.png', - name: 'Shinigami', - title: 'Maintainer', - org: 'Faker', - orgLink: 'https://fakerjs.dev', - desc: 'Passionate TypeScript enthusiast working extensively with Vue SPA and pug.', + avatar: 'https://github.com/dominikg.png', + name: 'Dominik G.', + title: 'Resident CI Expert', + desc: 'Team Member of Vite and Svelte', links: [ - { icon: 'github', link: 'https://github.com/Shinigami92' }, - { icon: 'twitter', link: 'https://twitter.com/Shini_92' }, + { icon: 'github', link: 'https://github.com/dominikg' }, + { icon: 'mastodon', link: 'https://elk.zone/m.webtoo.ls/@dominikg' }, ], - sponsor: 'https://github.com/sponsors/Shinigami92', + sponsor: 'https://github.com/sponsors/dominikg', }, + { + avatar: 'https://github.com/sheremet-va.png', + name: 'Vladimir', + title: 'Core team member of Vitest & Vite', + desc: 'An open source fullstack developer', + links: [ + { icon: 'github', link: 'https://github.com/sheremet-va' }, + { icon: 'bluesky', link: 'https://bsky.app/profile/erus.dev' }, + { icon: 'mastodon', link: 'https://elk.zone/m.webtoo.ls/@sheremet_va' }, + ], + sponsor: 'https://github.com/sponsors/sheremet-va', + }, + { + avatar: 'https://github.com/hi-ogawa.png', + name: 'Hiroshi Ogawa', + title: 'Team Member of Vitest & Vite', + desc: 'Open source enthusiast', + links: [ + { icon: 'github', link: 'https://github.com/hi-ogawa' }, + { icon: 'bluesky', link: 'https://bsky.app/profile/hiogawa.bsky.social' }, + ], + sponsor: 'https://github.com/sponsors/hi-ogawa', + }, + { + avatar: 'https://github.com/btea.png', + name: 'btea', + title: 'Web Developer', + links: [{ icon: 'github', link: 'https://github.com/btea' }], + }, +] + +export const emeriti = [ { avatar: 'https://i.imgur.com/KMed6rQ.jpeg', name: 'Alec Larson', @@ -93,9 +132,12 @@ export const core = [ desc: 'Dabbling in social ecommerce, meta frameworks, and board games', links: [ { icon: 'github', link: 'https://github.com/aleclarson' }, - { icon: 'twitter', link: 'https://twitter.com/retropragma' }, + { icon: 'x', link: 'https://x.com/retropragma' }, + { + icon: 'bluesky', + link: 'https://bsky.app/profile/retropragma.bsky.social', + }, ], - sponsor: 'https://github.com/sponsors/aleclarson', }, { avatar: 'https://github.com/poyoho.png', @@ -104,26 +146,9 @@ export const core = [ desc: 'Frontend. Vite team member.', links: [ { icon: 'github', link: 'https://github.com/poyoho' }, - { icon: 'twitter', link: 'https://twitter.com/yoho_po' }, + { icon: 'x', link: 'https://x.com/yoho_po' }, ], }, - { - avatar: 'https://github.com/ArnaudBarre.png', - name: 'Arnaud Barré', - title: 'Frontend Developer', - desc: 'Passionate by tooling around TypeScript and React.', - links: [{ icon: 'github', link: 'https://github.com/ArnaudBarre' }], - }, - { - avatar: 'https://github.com/dominikg.png', - name: 'Dominik G.', - title: 'Resident CI Expert', - desc: 'Team Member of Vite and Svelte', - links: [{ icon: 'github', link: 'https://github.com/dominikg' }], - }, -] - -export const emeriti = [ { avatar: 'https://github.com/ygj6.png', name: 'ygj6', @@ -131,7 +156,7 @@ export const emeriti = [ desc: 'Web Developer. Vue & Vite team member', links: [ { icon: 'github', link: 'https://github.com/ygj6' }, - { icon: 'twitter', link: 'https://twitter.com/ygj_66' }, + { icon: 'x', link: 'https://x.com/ygj_66' }, ], }, { @@ -139,10 +164,11 @@ export const emeriti = [ name: 'Niputi', title: 'Developer', org: 'Computershare Denmark', - desc: 'weeb/javascript lover.', + desc: 'weeb/JavaScript lover.', links: [ { icon: 'github', link: 'https://github.com/Niputi' }, - { icon: 'twitter', link: 'https://twitter.com/Niputi_' }, + { icon: 'x', link: 'https://x.com/Niputi_' }, + { icon: 'bluesky', link: 'https://bsky.app/profile/niputi.bsky.social' }, ], }, { @@ -155,7 +181,10 @@ export const emeriti = [ avatar: 'https://github.com/GrygrFlzr.png', name: 'GrygrFlzr', title: 'Developer', - links: [{ icon: 'github', link: 'https://github.com/GrygrFlzr' }], + links: [ + { icon: 'github', link: 'https://github.com/GrygrFlzr' }, + { icon: 'bluesky', link: 'https://bsky.app/profile/bsky.cybeast.dev' }, + ], }, { avatar: 'https://github.com/nihalgonsalves.png', @@ -163,4 +192,30 @@ export const emeriti = [ title: 'Senior Software Engineer', links: [{ icon: 'github', link: 'https://github.com/nihalgonsalves' }], }, + { + avatar: 'https://github.com/Shinigami92.png', + name: 'Shinigami', + title: 'Senior Frontend Engineer', + org: 'Faker', + orgLink: 'https://fakerjs.dev', + desc: 'Passionate TypeScript enthusiast working extensively with Vue SPA.', + links: [ + { icon: 'github', link: 'https://github.com/Shinigami92' }, + { icon: 'mastodon', link: 'https://elk.zone/mas.to/@Shini92' }, + ], + }, + { + avatar: 'https://github.com/haoqunjiang.png', + name: 'Haoqun Jiang', + title: 'Core Team Member', + org: 'Vue.js', + orgLink: 'https://vuejs.org/', + desc: 'Curator of best practices for Vue.js tooling', + links: [ + { icon: 'github', link: 'https://github.com/haoqunjiang' }, + { icon: 'bluesky', link: 'https://bsky.app/profile/haoqun.dev' }, + { icon: 'mastodon', link: 'https://elk.zone/m.webtoo.ls/@haoqun' }, + ], + sponsor: 'https://github.com/sponsors/haoqunjiang', + }, ] diff --git a/blog.md b/blog.md new file mode 100644 index 00000000..ffbc2c9c --- /dev/null +++ b/blog.md @@ -0,0 +1,13 @@ +--- +sidebar: false +editLink: false +outline: false +--- + + + +# Vite ブログの最新記事 + + diff --git a/blog/announcing-vite2.md b/blog/announcing-vite2.md index 0007205d..47ee96d5 100644 --- a/blog/announcing-vite2.md +++ b/blog/announcing-vite2.md @@ -1,9 +1,28 @@ --- +title: Announcing Vite 2.0 +author: + - name: The Vite Team sidebar: false +date: 2021-02-16 +head: + - - meta + - property: og:type + content: website + - - meta + - property: og:title + content: Announcing Vite 2.0 + - - meta + - property: og:url + content: https://vite.dev/blog/announcing-vite2 + - - meta + - property: og:description + content: Vite 2 Release Announcement --- # Announcing Vite 2.0 +_February 16, 2021_ - Check out the [Vite 3.0 announcement](./announcing-vite3.md) +

@@ -14,7 +33,7 @@ Vite (French word for "fast", pronounced `/vit/`) is a new kind of build tool fo To get a sense of how fast Vite is, check out [this video comparison](https://twitter.com/amasad/status/1355379680275128321) of booting up a React application on Repl.it using Vite vs. `create-react-app` (CRA). -If you've never heard of Vite before and would love to learn more about it, check out [the rationale behind the project](https://vitejs.dev/guide/why.html). If you are interested in how Vite differs from other similar tools, check out the [comparisons](https://vitejs.dev/guide/comparisons.html). +If you've never heard of Vite before and would love to learn more about it, check out [the rationale behind the project](https://vite.dev/guide/why.html). If you are interested in how Vite differs from other similar tools, check out the [comparisons](https://v5.vite.dev/guide/comparisons.html). ## What's New in 2.0 @@ -30,7 +49,7 @@ Vite 2.0 takes what we learned along the way and is redesigned from scratch with Inspired by [WMR](https://github.com/preactjs/wmr), the new plugin system extends Rollup's plugin interface and is [compatible with many Rollup plugins](https://vite-rollup-plugins.patak.dev/) out of the box. Plugins can use Rollup-compatible hooks, with additional Vite-specific hooks and properties to adjust Vite-only behavior (e.g. differentiating dev vs. build or custom handling of HMR). -The [programmatic API](https://vitejs.dev/guide/api-javascript.html) has also been greatly improved to facilitate higher level tools / frameworks built on top of Vite. +The [programmatic API](https://vite.dev/guide/api-javascript.html) has also been greatly improved to facilitate higher level tools / frameworks built on top of Vite. ### esbuild Powered Dep Pre-Bundling @@ -46,7 +65,7 @@ Vite treats CSS as a first-class citizen of the module graph and supports the fo ### Server-Side Rendering (SSR) Support -Vite 2.0 ships with [experimental SSR support](https://vitejs.dev/guide/ssr.html). Vite provides APIs to efficiently load and update ESM-based source code in Node.js during development (almost like server-side HMR), and automatically externalizes CommonJS-compatible dependencies to improve development and SSR build speed. The production server can be completely decoupled from Vite, and the same setup can be easily adapted to perform pre-rendering / SSG. +Vite 2.0 ships with [experimental SSR support](https://vite.dev/guide/ssr.html). Vite provides APIs to efficiently load and update ESM-based source code in Node.js during development (almost like server-side HMR), and automatically externalizes CommonJS-compatible dependencies to improve development and SSR build speed. The production server can be completely decoupled from Vite, and the same setup can be easily adapted to perform pre-rendering / SSG. Vite SSR is provided as a low-level feature and we are expecting to see higher level frameworks leveraging it under the hood. @@ -62,4 +81,4 @@ That was a lot of features, but getting started with Vite is simple! You can spi npm init @vitejs/app ``` -Then, check out [the guide](https://vitejs.dev/guide/) to see what Vite provides out of the box. You can also check out the source code on [GitHub](https://github.com/vitejs/vite), follow updates on [Twitter](https://twitter.com/vite_js), or join discussions with other Vite users on our [Discord chat server](http://chat.vitejs.dev/). +Then, check out [the guide](https://vite.dev/guide/) to see what Vite provides out of the box. You can also check out the source code on [GitHub](https://github.com/vitejs/vite), follow updates on [Twitter](https://twitter.com/vite_js), or join discussions with other Vite users on our [Discord chat server](http://chat.vite.dev/). diff --git a/blog/announcing-vite3.md b/blog/announcing-vite3.md index e31f950a..f20dbf33 100644 --- a/blog/announcing-vite3.md +++ b/blog/announcing-vite3.md @@ -1,4 +1,8 @@ --- +title: Vite 3.0 is out! +author: + name: The Vite Team +date: 2022-07-23 sidebar: false head: - - meta @@ -9,10 +13,10 @@ head: content: Announcing Vite 3 - - meta - property: og:image - content: https://vitejs.dev/og-image-announcing-vite3.png + content: https://vite.dev/og-image-announcing-vite3.webp - - meta - property: og:url - content: https://vitejs.dev/blog/announcing-vite3 + content: https://vite.dev/blog/announcing-vite3 - - meta - property: og:description content: Vite 3 Release Announcement @@ -23,35 +27,37 @@ head: # Vite 3.0 is out! -In February last year, [Evan You](https://twitter.com/youyuxi) released Vite 2. Since then, its adoption has grown non-stop, reaching more than 1 million npm downloads per week. A sprawling ecosystem rapidly formed after the release. Vite is powering a renewed innovation race in Web frameworks. [Nuxt 3](https://v3.nuxtjs.org/) uses Vite by default. [SvelteKit](https://kit.svelte.dev/), [Astro](https://astro.build/), [Hydrogen](https://hydrogen.shopify.dev/), and [SolidStart](https://docs.solidjs.com/start) are all built with Vite. [Laravel has now decided to use Vite by default](https://laravel.com/docs/9.x/vite). [Vite Ruby](https://vite-ruby.netlify.app/) shows how Vite can improve Rails DX. [Vitest](https://vitest.dev) is making strides as a Vite-native alternative to Jest. Vite is behind [Cypress](https://docs.cypress.io/guides/component-testing/writing-your-first-component-test) and [Playwright](https://playwright.dev/docs/test-components)'s new Component Testing features, Storybook has [Vite as an official builder](https://github.com/storybookjs/builder-vite). And [the list goes on](https://patak.dev/vite/ecosystem.html). Maintainers from most of these projects got involved in improving the Vite core itself, working closely with the Vite [team](https://vitejs.dev/team) and other contributors. +_July 23, 2022_ - Check out the [Vite 4.0 announcement](./announcing-vite4.md) -![Vite 3 Announcement Cover Image](/og-image-announcing-vite3.png) +In February last year, [Evan You](https://twitter.com/youyuxi) released Vite 2. Since then, its adoption has grown non-stop, reaching more than 1 million npm downloads per week. A sprawling ecosystem rapidly formed after the release. Vite is powering a renewed innovation race in Web frameworks. [Nuxt 3](https://v3.nuxtjs.org/) uses Vite by default. [SvelteKit](https://kit.svelte.dev/), [Astro](https://astro.build/), [Hydrogen](https://hydrogen.shopify.dev/), and [SolidStart](https://docs.solidjs.com/quick-start) are all built with Vite. [Laravel has now decided to use Vite by default](https://laravel.com/docs/9.x/vite). [Vite Ruby](https://vite-ruby.netlify.app/) shows how Vite can improve Rails DX. [Vitest](https://vitest.dev) is making strides as a Vite-native alternative to Jest. Vite is behind [Cypress](https://docs.cypress.io/guides/component-testing/writing-your-first-component-test) and [Playwright](https://playwright.dev/docs/test-components)'s new Component Testing features, Storybook has [Vite as an official builder](https://github.com/storybookjs/builder-vite). And [the list goes on](https://patak.dev/vite/ecosystem.html). Maintainers from most of these projects got involved in improving the Vite core itself, working closely with the Vite [team](https://vite.dev/team) and other contributors. + +![Vite 3 Announcement Cover Image](/og-image-announcing-vite3.webp) Today, 16 months from the v2 launch we are happy to announce the release of Vite 3. We decided to release a new Vite major at least every year to align with [Node.js's EOL](https://nodejs.org/en/about/releases/), and take the opportunity to review Vite's API regularly with a short migration path for projects in the ecosystem. Quick links: - [Docs](/) -- [Migration Guide](/guide/migration) +- [Migration Guide](https://v3.vite.dev/guide/migration.html) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md#300-2022-07-13) -If you are new to Vite, we recommend reading the [Why Vite Guide](https://vitejs.dev/guide/why.html). Then check out [the Getting Started](https://vitejs.dev/guide/) and [Features guide](https://vitejs.dev/guide/features) to see what Vite provides out of the box. As usual, contributions are welcome at [GitHub](https://github.com/vitejs/vite). More than [600 collaborators](https://github.com/vitejs/vite/graphs/contributors) have helped improve Vite so far. Follow the updates on [Twitter](https://twitter.com/vite_js), or join discussions with other Vite users on our [Discord chat server](http://chat.vitejs.dev/). +If you are new to Vite, we recommend reading the [Why Vite Guide](https://vite.dev/guide/why.html). Then check out [the Getting Started](https://vite.dev/guide/) and [Features guide](https://vite.dev/guide/features) to see what Vite provides out of the box. As usual, contributions are welcome at [GitHub](https://github.com/vitejs/vite). More than [600 collaborators](https://github.com/vitejs/vite/graphs/contributors) have helped improve Vite so far. Follow the updates on [Twitter](https://twitter.com/vite_js), or join discussions with other Vite users on our [Discord chat server](http://chat.vite.dev/). ## New Documentation -Go to [vitejs.dev](https://vitejs.dev) to enjoy the new v3 docs. Vite is now using the new [VitePress](https://vitepress.vuejs.org) default theme, with a stunning dark mode between other features. +Go to [vite.dev](https://vite.dev) to enjoy the new v3 docs. Vite is now using the new [VitePress](https://vitepress.vuejs.org) default theme, with a stunning dark mode between other features. -[![Vite documentation frontpage](../images/v3-docs.png)](https://vitejs.dev) +[![Vite documentation frontpage](../images/v3-docs.webp)](https://vite.dev) Several projects in the ecosystem have already migrated to it (see [Vitest](https://vitest.dev), [vite-plugin-pwa](https://vite-plugin-pwa.netlify.app/), and [VitePress](https://vitepress.vuejs.org/) itself). -If you need to access the Vite 2 docs, they will remain online at [v2.vitejs.dev](https://v2.vitejs.dev). There is also a new [main.vitejs.dev](https://main.vitejs.dev) subdomain, where each commit to Vite’s main branch is auto deployed. This is useful when testing beta versions or contributing to the core’s development. +If you need to access the Vite 2 docs, they will remain online at [v2.vite.dev](https://v2.vite.dev). There is also a new [main.vite.dev](https://main.vite.dev) subdomain, where each commit to Vite’s main branch is auto deployed. This is useful when testing beta versions or contributing to the core’s development. There is also now an official Spanish translation, that has been added to the previous Chinese and Japanese translations: -- [简体中文](https://cn.vitejs.dev/) -- [日本語](https://ja.vitejs.dev/) -- [Español](https://es.vitejs.dev/) +- [简体中文](https://cn.vite.dev/) +- [日本語](https://ja.vite.dev/) +- [Español](https://es.vite.dev/) ## Create Vite Starter Templates @@ -179,7 +185,7 @@ Learn more in the [WebAssembly guide](/guide/features.html#webassembly) ### ESM SSR Build by Default -Most SSR frameworks in the ecosystem were already using ESM builds. So, Vite 3 makes ESM the default format for SSR builds. This allows us to streamline previous [SSR externalization heuristics](https://vitejs.dev/guide/ssr.html#ssr-externals), externalizing dependencies by default. +Most SSR frameworks in the ecosystem were already using ESM builds. So, Vite 3 makes ESM the default format for SSR builds. This allows us to streamline previous [SSR externalization heuristics](https://vite.dev/guide/ssr.html#ssr-externals), externalizing dependencies by default. ### Improved Relative Base Support @@ -193,7 +199,7 @@ There are other deploy scenarios where this isn't enough. For example, if the ge ### Esbuild Deps Optimization at Build Time (Experimental) -One of the main differences between dev and build time is how Vite handles dependencies. During build time, [`@rollup/plugin-commonjs`](https://github.com/rollup/plugins/tree/master/packages/commonjs) is used to allow importing CJS only dependencies (like React). When using the dev server, esbuild is used instead to pre-bundle and optimize dependencies, and an inline interop scheme is applied while transforming user code importing CJS deps. During the development of Vite 3, we introduced the changes needed to also allow the use of [esbuild to optimize dependencies during build time](/guide/migration.html#using-esbuild-deps-optimization-at-build-time). [`@rollup/plugin-commonjs`](https://github.com/rollup/plugins/tree/master/packages/commonjs) can then be avoided, making dev and build time work in the same way. +One of the main differences between dev and build time is how Vite handles dependencies. During build time, [`@rollup/plugin-commonjs`](https://github.com/rollup/plugins/tree/master/packages/commonjs) is used to allow importing CJS only dependencies (like React). When using the dev server, esbuild is used instead to pre-bundle and optimize dependencies, and an inline interop scheme is applied while transforming user code importing CJS deps. During the development of Vite 3, we introduced the changes needed to also allow the use of [esbuild to optimize dependencies during build time](https://v3.vite.dev/guide/migration.html#using-esbuild-deps-optimization-at-build-time). [`@rollup/plugin-commonjs`](https://github.com/rollup/plugins/tree/master/packages/commonjs) can then be avoided, making dev and build time work in the same way. Given that Rollup v3 will be out in the next months, and we're going to follow up with another Vite major, we've decided to make this mode optional to reduce v3 scope and give Vite and the ecosystem more time to work out possible issues with the new CJS interop approach during build time. Frameworks may switch to using esbuild deps optimization during build time by default at their own pace before Vite 4. @@ -211,15 +217,15 @@ Vite cares about its publish and install footprint; a fast installation of a new | Vite 3.0.0 | 3.05MB | 17.8MB | | Reduction | -30% | -7% | -In part, this reduction was possible by making some dependencies that most users weren't needing optional. First, [Terser](https://github.com/terser/terser) is no longer installed by default. This dependency was no longer needed since we already made esbuild the default minifier for both JS and CSS in Vite 2. If you use `build.minify: 'terser'`, you'll need to install it (`npm add -D terser`). We also moved [node-forge](https://github.com/digitalbazaar/forge) out of the monorepo, implementing support for automatic https certificate generation as a new plugin: [`@vitejs/plugin-basic-ssl`](/guide/migration.html#automatic-https-certificate-generation). Since this feature only creates untrusted certificates that are not added to the local store, it didn't justify the added size. +In part, this reduction was possible by making some dependencies that most users weren't needing optional. First, [Terser](https://github.com/terser/terser) is no longer installed by default. This dependency was no longer needed since we already made esbuild the default minifier for both JS and CSS in Vite 2. If you use `build.minify: 'terser'`, you'll need to install it (`npm add -D terser`). We also moved [node-forge](https://github.com/digitalbazaar/forge) out of the monorepo, implementing support for automatic https certificate generation as a new plugin: [`@vitejs/plugin-basic-ssl`](https://v3.vite.dev/guide/migration.html#automatic-https-certificate-generation). Since this feature only creates untrusted certificates that are not added to the local store, it didn't justify the added size. ## Bug Fixing A triaging marathon was spearheaded by [@bluwyoo](https://twitter.com/bluwyoo), [@sapphi_red](https://twitter.com/sapphi_red), that recently joined the Vite team. During the past three months, the Vite open issues were reduced from 770 to 400. And this dive was achieved while the newly open PRs were at an all-time high. At the same time, [@haoqunjiang](https://twitter.com/haoqunjiang) had also curated a comprehensive [overview of Vite issues](https://github.com/vitejs/vite/discussions/8232). -[![Graph of open issues and pull requests in Vite](../images/v3-open-issues-and-PRs.png)](https://www.repotrends.com/vitejs/vite) +[![Graph of open issues and pull requests in Vite](../images/v3-open-issues-and-PRs.webp)](https://www.repotrends.com/vitejs/vite) -[![Graph of new issues and pull requests in Vite](../images/v3-new-open-issues-and-PRs.png)](https://www.repotrends.com/vitejs/vite) +[![Graph of new issues and pull requests in Vite](../images/v3-new-open-issues-and-PRs.webp)](https://www.repotrends.com/vitejs/vite) ## Compatibility Notes @@ -228,7 +234,7 @@ A triaging marathon was spearheaded by [@bluwyoo](https://twitter.com/bluwyoo), - The Modern Browser Baseline now targets browsers which support the [native ES Modules](https://caniuse.com/es6-module), [native ESM dynamic import](https://caniuse.com/es6-module-dynamic-import), and [`import.meta`](https://caniuse.com/mdn-javascript_operators_import_meta) features. - JS file extensions in SSR and library mode now use a valid extension (`js`, `mjs`, or `cjs`) for output JS entries and chunks based on their format and the package type. -Learn more in the [Migration Guide](/guide/migration). +Learn more in the [Migration Guide](https://v3.vite.dev/guide/migration.html). ## Upgrades to Vite Core @@ -267,4 +273,4 @@ We'll take the following months to ensure a smooth transition for all the projec The Rollup team is [working on its next major](https://twitter.com/lukastaegert/status/1544186847399743488), to be released in the following months. Once the Rollup plugins ecosystem has time to update, we'll follow up with a new Vite major. This will give us another opportunity to introduce more significant changes this year, which we could take to stabilize some of the experimental features introduced in this release. -If you are interested in helping improve Vite, the best way to get on board is to help with triaging issues. Join [our Discord](https://chat.vitejs.dev) and look for the `#contributing` channel. Or get involved in our `#docs`, `#help` others, or create plugins. We are just getting started. There are many open ideas to keep improving Vite's DX. +If you are interested in helping improve Vite, the best way to get on board is to help with triaging issues. Join [our Discord](https://chat.vite.dev) and look for the `#contributing` channel. Or get involved in our `#docs`, `#help` others, or create plugins. We are just getting started. There are many open ideas to keep improving Vite's DX. diff --git a/blog/announcing-vite4-3.md b/blog/announcing-vite4-3.md new file mode 100644 index 00000000..bc61f0b6 --- /dev/null +++ b/blog/announcing-vite4-3.md @@ -0,0 +1,90 @@ +--- +title: Vite 4.3 is out! +author: + name: The Vite Team +date: 2023-04-20 +sidebar: false +head: + - - meta + - property: og:type + content: website + - - meta + - property: og:title + content: Announcing Vite 4.3 + - - meta + - property: og:image + content: https://vite.dev/og-image-announcing-vite4-3.webp + - - meta + - property: og:url + content: https://vite.dev/blog/announcing-vite4-3 + - - meta + - property: og:description + content: Vite 4.3 Release Announcement + - - meta + - name: twitter:card + content: summary_large_image +--- + +# Vite 4.3 is out! + +_April 20, 2023_ + +![Vite 4.3 Announcement Cover Image](/og-image-announcing-vite4-3.webp) + +Quick links: + +- Docs: [English](/), [简体中文](https://cn.vite.dev/), [日本語](https://ja.vite.dev/), [Español](https://es.vite.dev/), [Português](https://pt.vite.dev/) +- [Vite 4.3 Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md#430-2023-04-20) + +## Performance Improvements + +In this minor, we focused on improving the dev server performance. The resolve logic got streamlined, improving hot paths and implementing smarter caching for finding `package.json`, TS config files, and resolved URL in general. + +You can read a detailed walkthrough of the performance work done in this blog post by one of Vite Contributors: [How we made Vite 4.3 faaaaster 🚀](https://sun0day.github.io/blog/vite/why-vite4_3-is-faster.html). + +This sprint resulted in speed improvements across the board compared to Vite 4.2. + +These are the performance improvements as measured by [sapphi-red/performance-compare](https://github.com/sapphi-red/performance-compare), which tests an app with 1000 React Components cold and warm dev server startup time as well as HMR times for a root and a leaf component: + +| **Vite (babel)** | Vite 4.2 | Vite 4.3 | Improvement | +| :----------------- | --------: | -------: | ----------: | +| **dev cold start** | 17249.0ms | 5132.4ms | -70.2% | +| **dev warm start** | 6027.8ms | 4536.1ms | -24.7% | +| **Root HMR** | 46.8ms | 26.7ms | -42.9% | +| **Leaf HMR** | 27.0ms | 12.9ms | -52.2% | + +| **Vite (swc)** | Vite 4.2 | Vite 4.3 | Improvement | +| :----------------- | --------: | -------: | ----------: | +| **dev cold start** | 13552.5ms | 3201.0ms | -76.4% | +| **dev warm start** | 4625.5ms | 2834.4ms | -38.7% | +| **Root HMR** | 30.5ms | 24.0ms | -21.3% | +| **Leaf HMR** | 16.9ms | 10.0ms | -40.8% | + +![Vite 4.3 vs 4.2 startup time comparison](../images/vite4-3-startup-time.webp) + +![Vite 4.3 vs 4.2 HMR time comparison](../images/vite4-3-hmr-time.webp) + +You can read more information about the benchmark [here](https://gist.github.com/sapphi-red/25be97327ee64a3c1dce793444afdf6e). Specs and Versions for this performance run: + +- CPU: Ryzen 9 5900X, Memory: DDR4-3600 32GB, SSD: WD Blue SN550 NVME SSD +- Windows 10 Pro 21H2 19044.2846 +- Node.js 18.16.0 +- Vite and React Plugin versions + - Vite 4.2 (babel): Vite 4.2.1 + plugin-react 3.1.0 + - Vite 4.3 (babel): Vite 4.3.0 + plugin-react 4.0.0-beta.1 + - Vite 4.2 (swc): Vite 4.2.1 + plugin-react-swc 3.2.0 + - Vite 4.3 (swc): Vite 4.3.0 + plugin-react-swc 3.3.0 + +Early adopters have also reported seeing 1.5x-2x dev startup time improvement on real apps while testing the Vite 4.3 beta. We'd love to know the results for your apps. + +## Profiling + +We'll continue to work on Vite's performance. We're working on an official [Benchmark tool](https://github.com/vitejs/vite-benchmark) for Vite that let us get performance metrics for each Pull Request. + +And [vite-plugin-inspect](https://github.com/antfu/vite-plugin-inspect) now has more performance-related features to help you identify which plugins or middlewares are the bottleneck for your applications. + +Using `vite --profile` (and then pressing `p`) once the page loads will save a CPU profile of the dev server startup. You can open them in an app as [speedscope](https://www.speedscope.app/) to identify performance issues. And you can share your findings with the Vite Team in a [Discussion](https://github.com/vitejs/vite/discussions) or in [Vite's Discord](https://chat.vite.dev). + +## Next Steps + +We decided to do a single Vite Major this year aligning with the [EOL of Node.js 16](https://endoflife.date/nodejs) in September, dropping support for both Node.js 14 and 16 in it. If you would like to get involved, we started a [Vite 5 Discussion](https://github.com/vitejs/vite/discussions/12466) to gather early feedback. diff --git a/blog/announcing-vite4.md b/blog/announcing-vite4.md index 90140a80..b14b6333 100644 --- a/blog/announcing-vite4.md +++ b/blog/announcing-vite4.md @@ -1,4 +1,8 @@ --- +title: Vite 4.0 is out! +author: + name: The Vite Team +date: 2022-12-09 sidebar: false head: - - meta @@ -9,10 +13,10 @@ head: content: Announcing Vite 4 - - meta - property: og:image - content: https://vitejs.dev/og-image-announcing-vite4.png + content: https://vite.dev/og-image-announcing-vite4.webp - - meta - property: og:url - content: https://vitejs.dev/blog/announcing-vite4 + content: https://vite.dev/blog/announcing-vite4 - - meta - property: og:description content: Vite 4 Release Announcement @@ -23,29 +27,31 @@ head: # Vite 4.0 is out! +_December 9, 2022_ - Check out the [Vite 5.0 announcement](./announcing-vite5.md) + Vite 3 [was released](./announcing-vite3.md) five months ago. npm downloads per week have gone from 1 million to 2.5 million since then. The ecosystem has matured too, and continues to grow. In this year's [Jamstack Conf survey](https://twitter.com/vite_js/status/1589665610119585793), usage among the community jumped from 14% to 32% while keeping a high 9.7 satisfaction score. We saw the stable releases of [Astro 1.0](https://astro.build/), [Nuxt 3](https://v3.nuxtjs.org/), and other Vite-powered frameworks that are innovating and collaborating: [SvelteKit](https://kit.svelte.dev/), [Solid Start](https://www.solidjs.com/blog/introducing-solidstart), [Qwik City](https://qwik.builder.io/qwikcity/overview/). Storybook announced first-class support for Vite as one of its main features for [Storybook 7.0](https://storybook.js.org/blog/first-class-vite-support-in-storybook/). Deno now [supports Vite](https://www.youtube.com/watch?v=Zjojo9wdvmY). [Vitest](https://vitest.dev) adoption is exploding, it will soon represent half of Vite's npm downloads. Nx is also investing in the ecosystem, and [officially supports Vite](https://nx.dev/packages/vite). -[![Vite 4 Ecosystem](/ecosystem-vite4.png)](https://viteconf.org/2022/replay) +[![Vite 4 Ecosystem](../images/ecosystem-vite4.webp)](https://viteconf.org/2022/replay) As a showcase of the growth Vite and related projects have experienced, the Vite ecosystem gathered on October 11th at [ViteConf 2022](https://viteconf.org/2022/replay). We saw representatives from the main web framework and tools tell stories of innovation and collaboration. And in a symbolic move, the Rollup team choose that exact day to release [Rollup 3](https://rollupjs.org). -Today, the Vite [team](https://vitejs.dev/team) with the help of our ecosystem partners, is happy to announce the release of Vite 4, powered during build time by Rollup 3. We've worked with the ecosystem to ensure a smooth upgrade path for this new major. Vite is now using [Rollup 3](https://github.com/vitejs/vite/issues/9870), which allowed us to simplify Vite's internal asset handling and has many improvements. See the [Rollup 3 release notes here](https://github.com/rollup/rollup/releases/tag/v3.0.0). +Today, the Vite [team](https://vite.dev/team) with the help of our ecosystem partners, is happy to announce the release of Vite 4, powered during build time by Rollup 3. We've worked with the ecosystem to ensure a smooth upgrade path for this new major. Vite is now using [Rollup 3](https://github.com/vitejs/vite/issues/9870), which allowed us to simplify Vite's internal asset handling and has many improvements. See the [Rollup 3 release notes here](https://github.com/rollup/rollup/releases/tag/v3.0.0). -![Vite 4 Announcement Cover Image](/og-image-announcing-vite4.png) +![Vite 4 Announcement Cover Image](/og-image-announcing-vite4.webp) Quick links: - [Docs](/) -- [Migration Guide](/guide/migration) +- [Migration Guide](https://v4.vite.dev/guide/migration.html) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md#400-2022-12-09) Docs in other languages: -- [简体中文](https://cn.vitejs.dev/) -- [日本語](https://ja.vitejs.dev/) -- [Español](https://es.vitejs.dev/) +- [简体中文](https://cn.vite.dev/) +- [日本語](https://ja.vite.dev/) +- [Español](https://es.vite.dev/) -If you recently started using Vite, we suggest reading the [Why Vite Guide](https://vitejs.dev/guide/why.html) and checking out [the Getting Started](https://vitejs.dev/guide/) and [Features guide](https://vitejs.dev/guide/features). If you want to get involved, contributions are welcome at [GitHub](https://github.com/vitejs/vite). Almost [700 collaborators](https://github.com/vitejs/vite/graphs/contributors) have contributed to Vite. Follow the updates on [Twitter](https://twitter.com/vite_js) and [Mastodon](https://webtoo.ls/@vite), or join collaborate with others on our [Discord community](http://chat.vitejs.dev/). +If you recently started using Vite, we suggest reading the [Why Vite Guide](https://vite.dev/guide/why.html) and checking out [the Getting Started](https://vite.dev/guide/) and [Features guide](https://vite.dev/guide/features). If you want to get involved, contributions are welcome at [GitHub](https://github.com/vitejs/vite). Almost [700 collaborators](https://github.com/vitejs/vite/graphs/contributors) have contributed to Vite. Follow the updates on [Twitter](https://twitter.com/vite_js) and [Mastodon](https://webtoo.ls/@vite), or join collaborate with others on our [Discord community](http://chat.vite.dev/). ## Start playing with Vite 4 @@ -85,7 +91,7 @@ This double loading could occur since a `.css` file will be emitted and it's lik import stuff from './global.css?inline' ``` -Learn more in the [Migration Guide](/guide/migration). +Learn more in the [Migration Guide](https://v4.vite.dev/guide/migration.html). ## Environment Variables @@ -129,6 +135,6 @@ We're also thankful to individuals and companies sponsoring the Vite team, and c ## Next steps -Our immediate focus would be on triaging newly opened issues to avoid disruption by possible regressions. If you would like to get involved and help us improve Vite, we suggest starting with issues triaging. Join [our Discord](https://chat.vitejs.dev) and reach out on the `#contributing` channel. Polish our `#docs` story, and `#help` others. We need to continue to build a helpful and welcoming community for the next wave of users, as Vite's adoption continues to grow. +Our immediate focus would be on triaging newly opened issues to avoid disruption by possible regressions. If you would like to get involved and help us improve Vite, we suggest starting with issues triaging. Join [our Discord](https://chat.vite.dev) and reach out on the `#contributing` channel. Polish our `#docs` story, and `#help` others. We need to continue to build a helpful and welcoming community for the next wave of users, as Vite's adoption continues to grow. There are a lot of open fronts to keep improving the DX of everyone that has chosen Vite to power their frameworks and develop their apps. Onwards! diff --git a/blog/announcing-vite5-1.md b/blog/announcing-vite5-1.md new file mode 100644 index 00000000..45651fe2 --- /dev/null +++ b/blog/announcing-vite5-1.md @@ -0,0 +1,134 @@ +--- +title: Vite 5.1 is out! +author: + name: The Vite Team +date: 2024-02-08 +sidebar: false +head: + - - meta + - property: og:type + content: website + - - meta + - property: og:title + content: Announcing Vite 5.1 + - - meta + - property: og:image + content: https://vite.dev/og-image-announcing-vite5-1.webp + - - meta + - property: og:url + content: https://vite.dev/blog/announcing-vite5-1 + - - meta + - property: og:description + content: Vite 5.1 Release Announcement + - - meta + - name: twitter:card + content: summary_large_image +--- + +# Vite 5.1 is out! + +_February 8, 2024_ + +![Vite 5.1 Announcement Cover Image](/og-image-announcing-vite5-1.webp) + +Vite 5 [was released](./announcing-vite5.md) last November, and it represented another big leap for Vite and the ecosystem. A few weeks ago we celebrated 10 million weekly npm downloads and 900 contributors to the Vite repo. Today, we're excited to announce the release of Vite 5.1. + +Quick links: [Docs](/), [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md#510-2024-02-08) + +Docs in other languages: [简体中文](https://cn.vite.dev/), [日本語](https://ja.vite.dev/), [Español](https://es.vite.dev/), [Português](https://pt.vite.dev/), [한국어](https://ko.vite.dev/), [Deutsch](https://de.vite.dev/) + +Try Vite 5.1 online in StackBlitz: [vanilla](https://vite.new/vanilla-ts), [vue](https://vite.new/vue-ts), [react](https://vite.new/react-ts), [preact](https://vite.new/preact-ts), [lit](https://vite.new/lit-ts), [svelte](https://vite.new/svelte-ts), [solid](https://vite.new/solid-ts), [qwik](https://vite.new/qwik-ts). + +If you're new to Vite, we suggest reading first the [Getting Started](/guide/) and [Features](/guide/features) guides. + +To stay up to date, follow us on [X](https://x.com/vite_js) or [Mastodon](https://webtoo.ls/@vite). + +## Vite Runtime API + +Vite 5.1 adds experimental support for a new Vite Runtime API. It allows running any code by processing it with Vite plugins first. It is different from `server.ssrLoadModule` because the runtime implementation is decoupled from the server. This lets library and framework authors implement their own layer of communication between the server and the runtime. This new API is intended to replace Vite's current SSR primitives once it is stable. + +The new API brings many benefits: + +- Support for HMR during SSR. +- It is decoupled from the server, so there is no limit on how many clients can use a single server - every client has its own module cache (you can even communicate with it how you want - using message channel/fetch call/direct function call/websocket). +- It doesn't depend on any node/bun/deno built-in APIs, so it can run in any environment. +- It's easy to integrate with tools that have their own mechanism to run code (you can provide a runner to use `eval` instead of `new AsyncFunction` for example). + +The initial idea [was proposed by Pooya Parsa](https://github.com/nuxt/vite/pull/201) and implemented by [Anthony Fu](https://github.com/antfu) as the [vite-node](https://github.com/vitest-dev/vitest/tree/main/packages/vite-node#readme) package to [power Nuxt 3 Dev SSR](https://antfu.me/posts/dev-ssr-on-nuxt) and later also used as the base for [Vitest](https://vitest.dev). So the general idea of vite-node has been battle-tested for quite some time now. This is a new iteration of the API by [Vladimir Sheremet](https://github.com/sheremet-va), who had already re-implemented vite-node in Vitest and took the learnings to make the API even more powerful and flexible when adding it to Vite Core. The PR was one year in the makings, you can see the evolution and discussions with ecosystem maintainers [here](https://github.com/vitejs/vite/issues/12165). + +::: info +The Vite Runtime API evolved into the Module Runner API, released in Vite 6 as part of the [Environment API](/guide/api-environment). +::: + +## Features + +### Improved support for `.css?url` + +Import CSS files as URLs now works reliably and correctly. This was the last remaining hurdle in Remix's move to Vite. See ([#15259](https://github.com/vitejs/vite/issues/15259)). + +### `build.assetsInlineLimit` now supports a callback + +Users can now [provide a callback](/config/build-options.html#build-assetsinlinelimit) that returns a boolean to opt-in or opt-out of inlining for specific assets. If `undefined` is returned, the default logic applies. See ([#15366](https://github.com/vitejs/vite/issues/15366)). + +### Improved HMR for circular import + +In Vite 5.0, accepted modules within circular imports always triggered a full page reload even if they can be handled fine in the client. This is now relaxed to allow HMR to apply without a full page reload, but if any error happens during HMR, the page will be reloaded. See ([#15118](https://github.com/vitejs/vite/issues/15118)). + +### Support `ssr.external: true` to externalize all SSR packages + +Historically, Vite externalizes all packages except for linked packages. This new option can be used to force externalize all packages including linked packages too. This is handy in tests within monorepos where we want to emulate the usual case of all packages externalized, or when using `ssrLoadModule` to load an arbitrary file and we want to always external packages as we don't care about HMR. See ([#10939](https://github.com/vitejs/vite/issues/10939)). + +### Expose `close` method in the preview server + +The preview server now exposes a `close` method, which will properly teardown the server including all opened socket connections. See ([#15630](https://github.com/vitejs/vite/issues/15630)). + +## Performance improvements + +Vite keeps getting faster with each release, and Vite 5.1 is packed with performance improvements. We measured the loading time for 10K modules (25 level deep tree) using [vite-dev-server-perf](https://github.com/yyx990803/vite-dev-server-perf) for all minor versions from Vite 4.0. This is a good benchmark to measure the effect of Vite's bundle-less approach. Each module is a small TypeScript file with a counter and imports to other files in the tree, so this mostly measuring the time it takes to do the requests a separate modules. In Vite 4.0, loading 10K modules took 8 seconds on a M1 MAX. We had a breakthrough in [Vite 4.3 were we focused on performance](./announcing-vite4-3.md), and we were able to load them in 6.35 seconds. In Vite 5.1, we managed to do another performance leap. Vite is now serving the 10K modules in 5.35 seconds. + +![Vite 10K Modules Loading time progression](../images/vite5-1-10K-modules-loading-time.webp) + +The results of this benchmark run on Headless Puppeteer and are a good way to compare versions. They don't represent the time as experienced by users though. When running the same 10K modules in an Incognito window is Chrome, we have: + +| 10K Modules | Vite 5.0 | Vite 5.1 | +| --------------------- | :------: | :------: | +| Loading time | 2892ms | 2765ms | +| Loading time (cached) | 2778ms | 2477ms | +| Full reload | 2003ms | 1878ms | +| Full reload (cached) | 1682ms | 1604ms | + +### Run CSS preprocessors in threads + +Vite now has opt-in support for running CSS preprocessors in threads. You can enable it using [`css.preprocessorMaxWorkers: true`](/config/shared-options.html#css-preprocessormaxworkers). For a Vuetify 2 project, dev startup time was reduced by 40% with this feature enabled. There is [performance comparison for others setups in the PR](https://github.com/vitejs/vite/pull/13584#issuecomment-1678827918). See ([#13584](https://github.com/vitejs/vite/issues/13584)). [Give Feedback](https://github.com/vitejs/vite/discussions/15835). + +### New options to improve server cold starts + +You can set `optimizeDeps.holdUntilCrawlEnd: false` to switch to a new strategy for deps optimization that may help in big projects. We're considering switching to this strategy by default in the future. [Give Feedback](https://github.com/vitejs/vite/discussions/15834). ([#15244](https://github.com/vitejs/vite/issues/15244)) + +### Faster resolving with cached checks + +The `fs.cachedChecks` optimization is now enabled by default. In Windows, `tryFsResolve` was ~14x faster with it, and resolving ids overall got a ~5x speed up in the triangle benchmark. ([#15704](https://github.com/vitejs/vite/issues/15704)) + +### Internal performance improvements + +The dev server had several incremental performance gains. A new middleware to short-circuit on 304 ([#15586](https://github.com/vitejs/vite/issues/15586)). We avoided `parseRequest` in hot paths ([#15617](https://github.com/vitejs/vite/issues/15617)). Rollup is now properly lazy loaded ([#15621](https://github.com/vitejs/vite/issues/15621)) + +## Deprecations + +We continue to reduce Vite's API surface where possible to make the project maintainable long term. + +### Deprecated `as` option in `import.meta.glob` + +The standard moved to [Import Attributes](https://github.com/tc39/proposal-import-attributes), but we don't plan to replace `as` with a new option at this point. Instead, it is recommended that the user switches to `query`. See ([#14420](https://github.com/vitejs/vite/issues/14420)). + +### Removed experimental build-time pre-bundling + +Build-time pre-bundling, an experimental feature added in Vite 3, is removed. With Rollup 4 switching its parser to native, and Rolldown being worked on, both the performance and the dev-vs-build inconsistency story for this feature are no longer valid. We want to continue improving dev/build consistency, and have concluded that using Rolldown for "prebundling during dev" and "production builds" is the better bet moving forward. Rolldown may also implement caching in a way that is a lot more efficient during build than deps prebundling. See ([#15184](https://github.com/vitejs/vite/issues/15184)). + +## Get Involved + +We are grateful to the [900 contributors to Vite Core](https://github.com/vitejs/vite/graphs/contributors), and the maintainers of plugins, integrations, tools, and translations that keeps pushing the ecosystem forward. If you're enjoying Vite, we invite you to participate and help us. Check out our [Contributing Guide](https://github.com/vitejs/vite/blob/main/CONTRIBUTING.md), and jump into [triaging issues](https://github.com/vitejs/vite/issues), [reviewing PRs](https://github.com/vitejs/vite/pulls), answering questions at [GitHub Discussions](https://github.com/vitejs/vite/discussions) and helping others in the community in [Vite Land](https://chat.vite.dev). + +## Acknowledgments + +Vite 5.1 is possible thanks to our community of contributors, maintainers in the ecosystem, and the [Vite Team](/team). A shout out to the individuals and companies sponsoring Vite development. [StackBlitz](https://stackblitz.com/), [Nuxt Labs](https://nuxtlabs.com/), and [Astro](https://astro.build) for hiring Vite team members. And also to the sponsors on [Vite's GitHub Sponsors](https://github.com/sponsors/vitejs), [Vite's Open Collective](https://opencollective.com/vite), and [Evan You's GitHub Sponsors](https://github.com/sponsors/yyx990803). diff --git a/blog/announcing-vite5.md b/blog/announcing-vite5.md new file mode 100644 index 00000000..498996ad --- /dev/null +++ b/blog/announcing-vite5.md @@ -0,0 +1,110 @@ +--- +title: Vite 5.0 is out! +author: + name: The Vite Team +date: 2023-11-16 +sidebar: false +head: + - - meta + - property: og:type + content: website + - - meta + - property: og:title + content: Announcing Vite 5 + - - meta + - property: og:image + content: https://vite.dev/og-image-announcing-vite5.webp + - - meta + - property: og:url + content: https://vite.dev/blog/announcing-vite5 + - - meta + - property: og:description + content: Vite 5 Release Announcement + - - meta + - name: twitter:card + content: summary_large_image +--- + +# Vite 5.0 is out! + +_November 16, 2023_ + +![Vite 5 Announcement Cover Image](/og-image-announcing-vite5.webp) + +Vite 4 [was released](./announcing-vite4.md) almost a year ago, and it served as a solid base for the ecosystem. npm downloads per week jumped from 2.5 million to 7.5 million, as projects keep building on a shared infrastructure. Frameworks continued to innovate, and on top of [Astro](https://astro.build/), [Nuxt](https://nuxt.com/), [SvelteKit](https://kit.svelte.dev/), [Solid Start](https://www.solidjs.com/blog/introducing-solidstart), [Qwik City](https://qwik.builder.io/qwikcity/overview/), between others, we saw new frameworks joining and making the ecosystem stronger. [RedwoodJS](https://redwoodjs.com/) and [Remix](https://remix.run/) switching to Vite paves the way for further adoption in the React ecosystem. [Vitest](https://vitest.dev) kept growing at an even faster pace than Vite. Its team has been hard at work and will soon [release Vitest 1.0](https://github.com/vitest-dev/vitest/issues/3596). The story of Vite when used with other tools such as [Storybook](https://storybook.js.org), [Nx](https://nx.dev), and [Playwright](https://playwright.dev) kept improving, and the same goes for environments, with Vite dev working both in [Deno](https://deno.com) and [Bun](https://bun.sh). + +We had the second edition of [ViteConf](https://viteconf.org/23/replay) a month ago, hosted by [StackBlitz](https://stackblitz.com). Like last year, most of the projects in the ecosystem got together to share ideas and connect to keep expanding the commons. We're also seeing new pieces complement the meta-framework tool belt like [Volar](https://volarjs.dev/) and [Nitro](https://nitro.build/). The Rollup team released [Rollup 4](https://rollupjs.org) that same day, a tradition Lukas started last year. + +Six months ago, Vite 4.3 [was released](./announcing-vite4.md). This release significantly improved the dev server performance. However, there is still ample room for improvement. At ViteConf, [Evan You unveiled Vite's long-term plan to work on Rolldown](https://www.youtube.com/watch?v=hrdwQHoAp0M), a Rust-port of Rollup with compatible APIs. Once it is ready, we intend to use it in Vite Core to take on the tasks of both Rollup and esbuild. This will mean a boost in build performance (and later on in dev performance too as we move perf-sensitive parts of Vite itself to Rust), and a big reduction of inconsistencies between dev and build. Rolldown is currently in early stages and the team is preparing to open source the codebase before the end of the year. Stay tuned! + +Today, we mark another big milestone in Vite's path. The Vite [team](/team), [contributors](https://github.com/vitejs/vite/graphs/contributors), and ecosystem partners, are excited to announce the release of Vite 5. Vite is now using [Rollup 4](https://github.com/vitejs/vite/pull/14508), which already represents a big boost in build performance. And there are also new options to improve your dev server performance profile. + +Vite 5 focuses on cleaning up the API (removing deprecated features) and streamlines several features closing long-standing issues, for example switching `define` to use proper AST replacements instead of regexes. We also continue to take steps to future-proof Vite (Node.js 18+ is now required, and [the CJS Node API has been deprecated](/guide/migration#deprecate-cjs-node-api)). + +Quick links: + +- [Docs](/) +- [Migration Guide](/guide/migration) +- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md#500-2023-11-16) + +Docs in other languages: + +- [简体中文](https://cn.vite.dev/) +- [日本語](https://ja.vite.dev/) +- [Español](https://es.vite.dev/) +- [Português](https://pt.vite.dev/) +- [한국어](https://ko.vite.dev/) +- [Deutsch](https://de.vite.dev/) (new translation!) + +If you're new to Vite, we suggest reading first the [Getting Started](/guide/) and [Features](/guide/features) guides. + +We appreciate the more than [850 contributors to Vite Core](https://github.com/vitejs/vite/graphs/contributors), and the maintainers and contributors of Vite plugins, integrations, tools, and translations that have helped us reach here. We encourage you to get involved and continue to improve Vite with us. You can learn more at our [Contributing Guide](https://github.com/vitejs/vite/blob/main/CONTRIBUTING.md). To get started, we recommend [triaging issues](https://github.com/vitejs/vite/issues), [reviewing PRs](https://github.com/vitejs/vite/pulls), sending failing tests PRs based on open issues, and helping others in [Discussions](https://github.com/vitejs/vite/discussions) and Vite Land's [help forum](https://discord.com/channels/804011606160703521/1019670660856942652). You'll learn a lot along the way and have a smooth path to further contributions to the project. If you have doubts, join us on our [Discord community](http://chat.vite.dev/) and say hi on the [#contributing channel](https://discord.com/channels/804011606160703521/804439875226173480). + +To stay up to date, follow us on [X](https://twitter.com/vite_js) or [Mastodon](https://webtoo.ls/@vite). + +## Quick start with Vite 5 + +Use `pnpm create vite` to scaffold a Vite project with your preferred framework, or open a started template online to play with Vite 5 using [vite.new](https://vite.new). You can also run `pnpm create vite-extra` to get access to templates from other frameworks and runtimes (Solid, Deno, SSR, and library starters). `create vite-extra` templates are also available when you run `create vite` under the `Others` option. + +Note that Vite starter templates are intended to be used as a playground to test Vite with different frameworks. When building your next project, we recommend reaching out to the starters recommended by each framework. Some frameworks now redirect in `create vite` to their starters too (`create-vue` and `Nuxt 3` for Vue, and `SvelteKit` for Svelte). + +## Node.js Support + +Vite no longer supports Node.js 14 / 16 / 17 / 19, which reached its EOL. Node.js 18 / 20+ is now required. + +## Performance + +On top of Rollup 4's build performance improvements, there is a new guide to help you identify and fix common performance issues at [https://vite.dev/guide/performance](/guide/performance). + +Vite 5 also introduces [server.warmup](/guide/performance.html#warm-up-frequently-used-files), a new feature to improve startup time. It lets you define a list of modules that should be pre-transformed as soon as the server starts. When using [`--open` or `server.open`](/config/server-options.html#server-open), Vite will also automatically warm up the entry point of your app or the provided URL to open. + +## Main Changes + +- [Vite is now powered by Rollup 4](/guide/migration#rollup-4) +- [The CJS Node API has been deprecated](/guide/migration#deprecate-cjs-node-api) +- [Rework `define` and `import.meta.env.*` replacement strategy](/guide/migration#rework-define-and-import-meta-env-replacement-strategy) +- [SSR externalized modules value now matches production](/guide/migration#ssr-externalized-modules-value-now-matches-production) +- [`worker.plugins` is now a function](/guide/migration#worker-plugins-is-now-a-function) +- [Allow path containing `.` to fallback to index.html](/guide/migration#allow-path-containing-to-fallback-to-index-html) +- [Align dev and preview HTML serving behavior](/guide/migration#align-dev-and-preview-html-serving-behaviour) +- [Manifest files are now generated in `.vite` directory by default](/guide/migration#manifest-files-are-now-generated-in-vite-directory-by-default) +- [CLI shortcuts require an additional `Enter` press](/guide/migration#cli-shortcuts-require-an-additional-enter-press) +- [Update `experimentalDecorators` and `useDefineForClassFields` TypeScript behavior](/guide/migration#update-experimentaldecorators-and-usedefineforclassfields-typescript-behaviour) +- [Remove `--https` flag and `https: true`](/guide/migration#remove-https-flag-and-https-true) +- [Remove `resolvePackageEntry` and `resolvePackageData` APIs](/guide/migration#remove-resolvepackageentry-and-resolvepackagedata-apis) +- [Removes previously deprecated APIs](/guide/migration#removed-deprecated-apis) +- [Read more about advanced changes affecting plugin and tool authors](/guide/migration#advanced) + +## Migrating to Vite 5 + +We have worked with ecosystem partners to ensure a smooth migration to this new major. Once again, [vite-ecosystem-ci](https://www.youtube.com/watch?v=7L4I4lDzO48) has been crucial to help us make bolder changes while avoiding regressions. We're thrilled to see other ecosystems adopt similar schemes to improve the collaboration between their projects and downstream maintainers. + +For most projects, the update to Vite 5 should be straight forward. But we advise reviewing the [detailed Migration Guide](/guide/migration) before upgrading. + +A low level breakdown with the full list of changes to Vite core can be found at the [Vite 5 Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md#500-2023-11-16). + +## Acknowledgments + +Vite 5 is the result of long hours of work by our community of contributors, downstream maintainers, plugins authors, and the [Vite Team](/team). A big shout out to [Bjorn Lu](https://twitter.com/bluwyoo) for leading the release process for this major. + +We're also thankful to individuals and companies sponsoring Vite development. [StackBlitz](https://stackblitz.com/), [Nuxt Labs](https://nuxtlabs.com/), and [Astro](https://astro.build) continue to invest in Vite by hiring Vite team members. A shout out to sponsors on [Vite's GitHub Sponsors](https://github.com/sponsors/vitejs), [Vite's Open Collective](https://opencollective.com/vite), and [Evan You's GitHub Sponsors](https://github.com/sponsors/yyx990803). A special mention to [Remix](https://remix.run/) for becoming a Gold sponsor and contributing back after switching to Vite. diff --git a/blog/announcing-vite6.md b/blog/announcing-vite6.md new file mode 100644 index 00000000..a4fc660c --- /dev/null +++ b/blog/announcing-vite6.md @@ -0,0 +1,115 @@ +--- +title: Vite 6.0 is out! +author: + name: The Vite Team +date: 2024-11-26 +sidebar: false +head: + - - meta + - property: og:type + content: website + - - meta + - property: og:title + content: Announcing Vite 6 + - - meta + - property: og:image + content: https://vite.dev/og-image-announcing-vite6.webp + - - meta + - property: og:url + content: https://vite.dev/blog/announcing-vite6 + - - meta + - property: og:description + content: Vite 6 Release Announcement + - - meta + - name: twitter:card + content: summary_large_image +--- + +# Vite 6.0 is out! + +_November 26, 2024_ + +![Vite 6 Announcement Cover Image](/og-image-announcing-vite6.webp) + +Today, we're taking another big step in Vite's story. The Vite [team](/team), [contributors](https://github.com/vitejs/vite/graphs/contributors), and ecosystem partners are excited to announce the release of Vite 6. + +It has been an eventful year. Vite adoption keeps growing, with npm downloads per week jumping from 7.5 million to 17 million since the release of Vite 5 a year ago. [Vitest](https://vitest.dev) is not only being favored more by users but is also starting to form an ecosystem of its own. For example, [Storybook](https://storybook.js.org) has new testing capabilities powered by Vitest. + +New frameworks have also joined the Vite ecosystem, including [TanStack Start](https://tanstack.com/start), [One](https://onestack.dev/), [Ember](https://emberjs.com/), and others. Web frameworks are innovating at an increasingly faster pace. You can check out the improvements folks have been doing at [Astro](https://astro.build/), [Nuxt](https://nuxt.com/), [SvelteKit](https://kit.svelte.dev/), [Solid Start](https://www.solidjs.com/blog/introducing-solidstart), [Qwik City](https://qwik.builder.io/qwikcity/overview/), [RedwoodJS](https://redwoodjs.com/), [React Router](https://reactrouter.com/), and the list goes on. + +Vite is used by OpenAI, Google, Apple, Microsoft, NASA, Shopify, Cloudflare, GitLab, Reddit, Linear, among many others. Two months ago, we started a list of [companies using Vite](https://github.com/vitejs/companies-using-vite). We're happy to see many developers sending us a PR to add their companies to the list. It's hard to believe how much the ecosystem we built together has grown since Vite gave its first steps. + +![Vite weekly npm downloads](../images/vite6-npm-weekly-downloads.webp) + +## Speeding up the Vite ecosystem + +Last month, the community gathered for the third edition of [ViteConf](https://viteconf.org/24/replay), hosted once more by [StackBlitz](https://stackblitz.com). It was the biggest Vite conference, with a broad representation of builders from the ecosystem. Among other announcements, Evan You announced [VoidZero](https://staging.voidzero.dev/posts/announcing-voidzero-inc), a company dedicated to building an open-source, high-performance, and unified development toolchain for the JavaScript ecosystem. VoidZero is behind [Rolldown](https://rolldown.rs) and [Oxc](https://oxc.rs), and their team is making significant strides, getting them rapidly ready for being adopted by Vite. Watch Evan's keynote to learn more about the next steps for Vite's rust-powered future. + + + +[Stackblitz](https://stackblitz.com) unveiled [bolt.new](https://bolt.new), a Remix app that combines Claude and WebContainers and lets you prompt, edit, run, and deploy full-stack apps. Nate Weiner announced [One](https://onestack.dev/), a new Vite-powered React framework for web and native. Storybook showcased their latest Vitest-powered [testing features](https://youtu.be/8t5wxrFpCQY?si=PYZoWKf-45goQYDt). And so much more. We encourage you to watch [all 43 talks](https://www.youtube.com/playlist?list=PLqGQbXn_GDmnObDzgjUF4Krsfl6OUKxtp). The speakers made a significant effort to share with us what each project has been up to. + +Vite also got a refreshed landing page and a clean domain. You should update your URLs to point to the new [vite.dev](https://vite.dev) domain moving forward. The new design and implementation was done by VoidZero, by the same folks that made their website. Shoutout to [Vicente Rodriguez](https://bento.me/rmoon) and [Simon Le Marchant](https://marchantweb.com/). + +## The next Vite major is here + +Vite 6 is the most significant major release since Vite 2. We're eager to partner with the ecosystem to keep expanding our shared commons through new APIs and, as usual, a more polished base upon which to build. + +Quick links: + +- [Docs](/) +- Translations: [简体中文](https://cn.vite.dev/), [日本語](https://ja.vite.dev/), [Español](https://es.vite.dev/), [Português](https://pt.vite.dev/), [한국어](https://ko.vite.dev/), [Deutsch](https://de.vite.dev/) +- [Migration Guide](/guide/migration) +- [GitHub Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md#600-2024-11-26) + +If you're new to Vite, we suggest reading the [Getting Started](/guide/) and [Features](/guide/features) guides first. + +We want to thank the more than [1K contributors to Vite Core](https://github.com/vitejs/vite/graphs/contributors) and the maintainers and contributors of Vite plugins, integrations, tools, and translations that have helped us craft this new major. We invite you to get involved and help us improve Vite for the whole ecosystem. Learn more at our [Contributing Guide](https://github.com/vitejs/vite/blob/main/CONTRIBUTING.md). + +To get started, we suggest helping [triage issues](https://github.com/vitejs/vite/issues), [review PRs](https://github.com/vitejs/vite/pulls), send failing tests PRs based on open issues, and support others in [Discussions](https://github.com/vitejs/vite/discussions) and Vite Land's [help forum](https://discord.com/channels/804011606160703521/1019670660856942652). If you'd like to talk to us, join our [Discord community](http://chat.vite.dev/) and say hi on the [#contributing channel](https://discord.com/channels/804011606160703521/804439875226173480). + +For the latest news about the Vite ecosystem and Vite core, follow us on [Bluesky](https://bsky.app/profile/vite.dev), [X](https://twitter.com/vite_js), or [Mastodon](https://webtoo.ls/@vite). + +## Getting started with Vite 6 + +You can use `pnpm create vite` to quickly scaffold a Vite app with your preferred framework or play online with Vite 6 using [vite.new](https://vite.new). You can also run `pnpm create vite-extra` to get access to templates from other frameworks and runtimes (Solid, Deno, SSR, and library starters). `create vite-extra` templates are also available when you run `create vite` under the `Others` option. + +The Vite starter templates are intended to be used as a playground to test Vite with different frameworks. When building your next project, you should reach out to the starter recommended by each framework. `create vite` also provides a shortcut to setup proper starters by some frameworks, like `create-vue`, `Nuxt 3`, `SvelteKit`, `Remix`, `Analog`, and `Angular`. + +## Node.js Support + +Vite 6 supports Node.js 18, 20, and 22+, similar to Vite 5. Node.js 21 support has been dropped. Vite drops Node.js support for older versions after their [EOL](https://endoflife.date/nodejs). The Node.js 18 EOL is at the end of April 2025, after which we may release a new major to bump the required Node.js version. + +## Experimental Environment API + +Vite is getting more flexible with the new Environment API. These new APIs will allow framework authors to offer a dev experience closer to production and for the Ecosystem to share new building blocks. Nothing changes if you're building a SPA; when you use Vite with a single client environment, everything works as before. And even for custom SSR apps, Vite 6 is backward compatible. The primary target audience for Environment API is framework authors. + +For end users who are curious, [Sapphi](https://github.com/sapphi-red) wrote a great [Introduction to Environment API](https://green.sapphi.red/blog/increasing-vites-potential-with-the-environment-api) guide. It is a great place to start and understand why we're trying to make Vite even more flexible. + +If you are a framework author or Vite plugin maintainer and would like to leverage the new APIs, you can learn more at the [Environment API Guides](https://main.vite.dev/guide/api-environment). + +We want to thank everyone involved in defining and implementing the new APIs. The story begins with Vite 2 adopting the unbundled SSR dev scheme pioneered by [Rich Harris](https://github.com/Rich-Harris) and the [SvelteKit](https://svelte.dev/docs/kit) team. Vite's SSR transform then unlocked [Anthony Fu](https://github.com/antfu/) and [Pooya Parsa](https://github.com/pi0) to create vite-node and improve [Nuxt's Dev SSR story](https://antfu.me/posts/dev-ssr-on-nuxt). Anthony went to use vite-node to power [Vitest](https://vitest.dev), and [Vladimir Sheremet](https://github.com/sheremet-va) kept improving it as part of his work maintaining Vitest. At the beginning of 2023, Vladimir started working to upstream vite-node to Vite Core, and we released it as Runtime API in Vite 5.1 a year later. Feedback from ecosystem partners (special shout-out to the Cloudflare team) pushed us to do a more ambitious rework of Vite's environments. You can learn more about the story at [Patak's ViteConf 24 talk](https://www.youtube.com/watch?v=WImor3HDyqU?si=EZ-rFJn4pDW3tUvp). + +Everyone on the Vite team participated in defining the new API, which was co-designed with feedback from many projects in the Ecosystem. Thanks to everyone involved! We encourage you to get involved if you're building a framework, plugin, or tool on top of Vite. The new APIs are experimental. We will work with the Ecosystem to review how the new APIs will be used and stabilize them for the next major. If you'd like to ask questions or give feedback, there is an [open GitHub discussion here](https://github.com/vitejs/vite/discussions/16358). + +## Main Changes + +- [Default value for `resolve.conditions`](/guide/migration#default-value-for-resolve-conditions) +- [JSON stringify](/guide/migration#json-stringify) +- [Extended support of asset references in HTML elements](/guide/migration#extended-support-of-asset-references-in-html-elements) +- [postcss-load-config](/guide/migration#postcss-load-config) +- [Sass now uses modern API by default](/guide/migration#sass-now-uses-modern-api-by-default) +- [Customize CSS output file name in library mode](/guide/migration#customize-css-output-file-name-in-library-mode) +- [And more changes that should only affect a few users](/guide/migration#advanced) + +There is also a new [Breaking Changes](/changes/) page that lists all planned, considering, and past changes in Vite. + +## Migrating to Vite 6 + +For most projects, the update to Vite 6 should be straightforward, but we advise reviewing the [detailed Migration Guide](/guide/migration) before upgrading. + +The complete list of changes is at the [Vite 6 Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md#500-2024-11-26). + +## Acknowledgments + +Vite 6 results from long work hours by our community of contributors, downstream maintainers, plugin authors, and the [Vite Team](/team). We appreciate the individuals and companies sponsoring Vite development. Vite is brought to you by [VoidZero](https://voidzero.dev), in partnership with [StackBlitz](https://stackblitz.com/), [Nuxt Labs](https://nuxtlabs.com/), and [Astro](https://astro.build). A shout-out to sponsors on [Vite's GitHub Sponsors](https://github.com/sponsors/vitejs) and [Vite's Open Collective](https://opencollective.com/vite). diff --git a/blog/announcing-vite7.md b/blog/announcing-vite7.md new file mode 100644 index 00000000..331fbf23 --- /dev/null +++ b/blog/announcing-vite7.md @@ -0,0 +1,95 @@ +--- +title: Vite 7.0 is out! +author: + name: The Vite Team +date: 2025-06-24 +sidebar: false +head: + - - meta + - property: og:type + content: website + - - meta + - property: og:title + content: Announcing Vite 7 + - - meta + - property: og:image + content: https://vite.dev/og-image-announcing-vite7.webp + - - meta + - property: og:url + content: https://vite.dev/blog/announcing-vite7 + - - meta + - property: og:description + content: Vite 7 Release Announcement + - - meta + - name: twitter:card + content: summary_large_image +--- + +# Vite 7.0 is out! + +_June 24, 2025_ + +![Vite 7 Announcement Cover Image](/og-image-announcing-vite7.webp) + +We're happy to share the release of Vite 7! It has been 5 years since Evan You sent the first commit to the Vite repo, and nobody could have predicted how much the frontend ecosystem would change since then. Most modern frontend frameworks and tools are now working together, building on top of Vite's shared infrastructure. And they can innovate at a faster pace by sharing at a higher level. Vite is now being downloaded 31 million times a week, with a 14 million increase in the last seven months since the previous major release. + +This year, we're making several big steps. To start with, [ViteConf](https://viteconf.org) is going to be in person! The Vite Ecosystem will gather in Amsterdam on October 9-10! Organized by [JSWorld](https://jsworldconference.com/) in partnership with [Bolt](https://bolt.new), [VoidZero](https://voidzero.dev), and the Vite Core Team! We had three incredible [ViteConf online editions](https://www.youtube.com/@viteconf/playlists), and we can't wait to meet in real life. Check out the speakers and get your ticket at the [ViteConf site](https://viteconf.org)! + +And [VoidZero](https://voidzero.dev/posts/announcing-voidzero-inc) continues to make significant strides in its mission to build an open source unified development toolchain for the JavaScript ecosystem. Over the last year, the VoidZero team has been working on [Rolldown](https://rolldown.rs/), a Rust-based next-generation bundler, as part of a broader effort to modernize Vite's core. You can try out the Rolldown-powered Vite today by using the `rolldown-vite` package instead of the default `vite` package. It is a drop-in replacement, as Rolldown will become the default bundler for Vite in the future. Switching should reduce your build time, especially for larger projects. Read more at the [Rolldown-vite announcement blog post](https://voidzero.dev/posts/announcing-rolldown-vite) and our [migration guide](https://vite.dev/rolldown). + +Through a partnership between VoidZero and [NuxtLabs](https://nuxtlabs.com/), Anthony Fu is working on creating Vite DevTools. They will offer deeper and more insightful debugging and analysis for all Vite-based projects and frameworks. You can read more on the [VoidZero and NuxtLabs join forces on Vite Devtools blog post](https://voidzero.dev/posts/voidzero-nuxtlabs-vite-devtools). + +Quick links: + +- [Docs](/) +- New Translation: [فارسی](https://fa.vite.dev/) +- Other Translations: [简体中文](https://cn.vite.dev/), [日本語](https://ja.vite.dev/), [Español](https://es.vite.dev/), [Português](https://pt.vite.dev/), [한국어](https://ko.vite.dev/), [Deutsch](https://de.vite.dev/) +- [Migration Guide](/guide/migration) +- [GitHub Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) + +Play online with Vite 7 using [vite.new](https://vite.new) or scaffold a Vite app locally with your preferred framework running `pnpm create vite`. Check out the [Getting Started Guide](/guide/) for more information. + +We invite you to help us improve Vite (joining the more than [1.1K contributors to Vite Core](https://github.com/vitejs/vite/graphs/contributors)), our dependencies, or plugins and projects in the ecosystem. Learn more at our [Contributing Guide](https://github.com/vitejs/vite/blob/main/CONTRIBUTING.md). A good way to get started is by [triaging issues](https://github.com/vitejs/vite/issues), [reviewing PRs](https://github.com/vitejs/vite/pulls), sending tests PRs based on open issues, and supporting others in [Discussions](https://github.com/vitejs/vite/discussions) or Vite Land's [help forum](https://discord.com/channels/804011606160703521/1019670660856942652). If you have questions, join our [Discord community](http://chat.vite.dev/) and talk to us in the [#contributing channel](https://discord.com/channels/804011606160703521/804439875226173480). + +Stay updated and connect with others building on top of Vite by following us on [Bluesky](https://bsky.app/profile/vite.dev), [X](https://twitter.com/vite_js), or [Mastodon](https://webtoo.ls/@vite). + +## Node.js Support + +Vite now requires Node.js 20.19+, 22.12+. We have dropped Node.js 18, now that it has reached its [EOL](https://endoflife.date/nodejs) at the end of April 2025. + +We require these new ranges so Node.js supports `require(esm)` without a flag. This allows us to distribute Vite 7.0 as ESM only without preventing the Vite JavaScript API from being required by CJS modules. Check out Anthony Fu's [Move on to ESM-only](https://antfu.me/posts/move-on-to-esm-only) for a detailed review of the current state of ESM in the ecosystem. + +## Default Browser Target Changed to Baseline Widely Available + +[Baseline](https://web-platform-dx.github.io/web-features/) gives us clear information about which web platform features work across their core browser set today. Baseline Widely Available indicates the feature is well-established and works across many devices and browser versions, being available across browsers for at least 30 months. + +In Vite 7, the default browser target is changing from `'modules'` to a new default: `'baseline-widely-available'`. The set of browsers will be updated on each major to match the list of minimum browser versions compatible with Baseline Widely available features. The default browser value of `build.target` is changing in Vite 7.0: + +- Chrome 87 → 107 +- Edge 88 → 107 +- Firefox 78 → 104 +- Safari 14.0 → 16.0 + +This change adds predictability to the default browser target for future releases. + +## Vitest + +For Vitest users, Vite 7.0 is supported from Vitest 3.2. You can read more about how the Vitest team keeps improving Vite testing story in the [Vitest 3.2 release blog post](https://vitest.dev/blog/vitest-3-2.html). + +## Environment API + +Vite 6 was the most significant major release since Vite 2, adding new capabilities with the [new experimental Environment API](https://vite.dev/blog/announcing-vite6.html#experimental-environment-api). We are keeping the new APIs as experimental while the ecosystem reviews how the new APIs fit on their projects and provide feedback. If you're building on top of Vite, we encourage you to test the new APIs and reach out to us in the [open Feedback discussion here](https://github.com/vitejs/vite/discussions/16358). + +In Vite 7, we added a new `buildApp` hook to let plugins coordinate the building of environments. Read more in the [Environment API for Frameworks guide](/guide/api-environment-frameworks.html#environments-during-build). + +We want to thank the teams that have been testing the new APIs and helping us stabilize the new features. The Cloudflare team, for example, announced the 1.0 release of their Cloudflare Vite plugin, as well as official support for React Router v7. Their plugin shows the potential of Environment API for runtime providers. Learn more about their approach and future steps at ["Just use Vite"… with the Workers runtime](https://blog.cloudflare.com/introducing-the-cloudflare-vite-plugin/). + +## Migrating to Vite 7 + +Vite 7 should be a smooth update from Vite 6. We're removing already deprecated features, like Sass legacy API support and the `splitVendorChunkPlugin` that shouldn't affect your projects. We still suggest you review the [detailed Migration Guide](/guide/migration) before upgrading. + +The complete list of changes is at the [Vite 7 Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md). + +## Acknowledgments + +Vite 7 was crafted by the [Vite Team](/team) with the help of the wide community of contributors, downstream maintainers, plugin authors. A special shout-out to [sapphi-red](https://github.com/sapphi-red) for his remarkable work on `rolldown-vite` and this release. Vite is brought to you by [VoidZero](https://voidzero.dev), in partnership with [Bolt](https://bolt.new/) and [Nuxt Labs](https://nuxtlabs.com/). We also want to thank our sponsors on [Vite's GitHub Sponsors](https://github.com/sponsors/vitejs) and [Vite's Open Collective](https://opencollective.com/vite). diff --git a/changes/hotupdate-hook.md b/changes/hotupdate-hook.md new file mode 100644 index 00000000..990874bc --- /dev/null +++ b/changes/hotupdate-hook.md @@ -0,0 +1,122 @@ +# HMR `hotUpdate` プラグインフック + +::: tip フィードバック +[Environment API feedback discussion](https://github.com/vitejs/vite/discussions/16358)でフィードバックをお寄せください。 +::: + +[Environment API](/guide/api-environment.md)を意識するために、`handleHotUpdate` プラグインフックを非推奨とし、[`hotUpdate` フック](/guide/api-environment#the-hotupdate-hook)を使用し、`create` と `delete` で追加の監視イベントを処理する予定です。 + +影響範囲: `Vite プラグイン作成者` + +::: warning 将来の廃止予定 +`hotUpdate` は `v6.0` で初めて導入されました。`handleHotUpdate` の廃止は将来のメジャーバージョンで予定されています。現時点では `handleHotUpdate` からの移行は推奨していません。もし実験して私たちにフィードバックをしたいのであれば、vite config で `future.removePluginHookHandleHotUpdate` を `"warn"` に指定してください。 +::: + +## 動機 + +[`handleHotUpdate` フック](/guide/api-plugin.md#handlehotupdate) はカスタム HMR 更新処理を行うことができます。更新するモジュールのリストは `HmrContext` に渡されます。 + +```ts +interface HmrContext { + file: string + timestamp: number + modules: Array + read: () => string | Promise + server: ViteDevServer +} +``` + +このフックはすべての環境に対して一度だけ呼び出され、渡されたモジュールはクライアント環境と SSR 環境だけの情報が混在しています。フレームワークがカスタム環境に移行すると、それぞれの環境に対して呼び出される新しいフックが必要になります。 + +新しい `hotUpdate` フックは `handleHotUpdate` と同じように動作しますが、環境ごとに呼び出され、新しい `HotUpdateOptions` インスタンスを受け取ります: + +```ts +interface HotUpdateOptions { + type: 'create' | 'update' | 'delete' + file: string + timestamp: number + modules: Array + read: () => string | Promise + server: ViteDevServer +} +``` + +現在の開発環境は他のプラグインフックのように `this.environment` でアクセスできます。`modules` のリストには現在の環境のモジュールノードのみが表示されます。各環境の更新は異なる更新ストラテジーを定義できます。 + +このフックは `'update'` だけでなく、追加の監視イベントでも呼び出されるようになりました。これらを区別するには `type` を使用します。 + +## 移行ガイド + +HMR がより正確になるように、影響を受けるモジュールのリストをフィルタリングして絞り込みます。 + +```js +handleHotUpdate({ modules }) { + return modules.filter(condition) +} + +// 以下に移行: + +hotUpdate({ modules }) { + return modules.filter(condition) +} +``` + +空の配列を返して完全なリロードを実行します: + +```js +handleHotUpdate({ server, modules, timestamp }) { + // モジュールを手動で無効化 + const invalidatedModules = new Set() + for (const mod of modules) { + server.moduleGraph.invalidateModule( + mod, + invalidatedModules, + timestamp, + true + ) + } + server.ws.send({ type: 'full-reload' }) + return [] +} + +// 以下に移行: + +hotUpdate({ modules, timestamp }) { + // モジュールを手動で無効化 + const invalidatedModules = new Set() + for (const mod of modules) { + this.environment.moduleGraph.invalidateModule( + mod, + invalidatedModules, + timestamp, + true + ) + } + this.environment.hot.send({ type: 'full-reload' }) + return [] +} +``` + +空の配列を返し、カスタムイベントをクライアントに送信することで、完全なカスタム HMR 処理を行います: + +```js +handleHotUpdate({ server }) { + server.ws.send({ + type: 'custom', + event: 'special-update', + data: {} + }) + return [] +} + +// 以下に移行... + +hotUpdate() { + this.environment.hot.send({ + type: 'custom', + event: 'special-update', + data: {} + }) + return [] +} +``` diff --git a/changes/index.md b/changes/index.md new file mode 100644 index 00000000..6c31ecb2 --- /dev/null +++ b/changes/index.md @@ -0,0 +1,26 @@ +# 破壊的変更 + +API の非推奨、削除、変更を含む、Vite の変更点のリストです。以下の変更のほとんどは、Vite の設定にある[`future` オプション](/config/shared-options.html#future)を使ってオプトインできます。 + +## 計画中 + +これらの変更は Vite の次のメジャーバージョンで予定されています。非推奨または使用上の警告は、可能な限りガイドし、私たちはこれらの変更を適用するようフレームワーク、プラグイン作者、ユーザーに働きかけています。 + +- [フック内の `this.environment`](/changes/this-environment-in-hooks) +- [HMR `hotUpdate` プラグインフック](/changes/hotupdate-hook) +- [`ModuleRunner` API を使った SSR](/changes/ssr-using-modulerunner) + +## 検討中 + +これらの変更は検討中であり、現在の使用パターンを改善するための実験的な API であることが多いです。すべての変更がここに記載されているわけではないので、完全なリストについては [Vite GitHub ディスカッションの experimental ラベル](https://github.com/vitejs/vite/discussions/categories/feedback?discussions_q=label%3Aexperimental+category%3AFeedback) を確認してください。 + +これらの API に切り替えることはまだお勧めしません。これらの API はフィードバックを集めるために Vite に含まれています。これらの提案を確認し、あなたのユースケースでどのように機能するか、それぞれのリンク先の GitHub Discussions でお知らせください。 + +- [環境ごとの API への移行](/changes/per-environment-apis) +- [ビルド時の共有プラグイン](/changes/shared-plugins-during-build) + +## 過去 + +以下の変更は、すでに終了または差し戻されています。現在のメジャーバージョンではこれらは関係ありません。 + +- _過去の変更はまだありません_ diff --git a/changes/per-environment-apis.md b/changes/per-environment-apis.md new file mode 100644 index 00000000..2716cd23 --- /dev/null +++ b/changes/per-environment-apis.md @@ -0,0 +1,40 @@ +# 環境ごとの API への移行 + +::: tip フィードバック +[Environment API feedback discussion](https://github.com/vitejs/vite/discussions/16358)でフィードバックをお寄せください。 +::: + +モジュールグラフとモジュール変換に関連する `ViteDevServer` の複数の API が `DevEnvironment` インスタンスに移動されました。 + +影響範囲: `Vite プラグイン作成者` + +::: warning 将来の廃止予定 +`Environment` インスタンスは `v6.0` で初めて導入されました。将来のメジャーバージョンでは現在環境にある `server.moduleGraph` やその他のメソッドが廃止される予定です。まだサーバーのメソッドから移行することはお勧めしません。使用状況を明確にするために、vite の設定でこれらを設定してください。 + +```ts +future: { + removeServerModuleGraph: 'warn', + removeServerReloadModule: 'warn', + removeServerPluginContainer: 'warn', + removeServerHot: 'warn', + removeServerTransformRequest: 'warn', + removeServerWarmupRequest: 'warn', +} +``` + +::: + +## 動機 + +Vite v5 以前では、単一の Vite 開発サーバーには常に 2 つの環境(`client` と `ssr`)がありました。 `server.moduleGraph` には、これらの両方の環境からの混合モジュールが含まれていました。ノードは `clientImportedModules` と `ssrImportedModules` のリストで接続されていました(ただし、それぞれに対して単一の `importers` リストが維持されていました)。変換されたモジュールは `id` と `ssr` ブーリアンで表されていました。このブール値は、`server.moduleGraph.getModuleByUrl(url, ssr)` や `server.transformRequest(url, { ssr })` などの API に渡す必要がありました。 + +Vite v6 では、任意の数のカスタム環境(`client`、`ssr`、`edge` など)を作成できるようになりました。単一の `ssr` ブール値では不十分になりました。API を `server.transformRequest(url, { environment })` という形式に変更する代わりに、これらのメソッドを環境インスタンスに移動し、Vite 開発サーバーなしで呼び出せるようにしました。 + +## 移行ガイド + +- `server.moduleGraph` -> [`environment.moduleGraph`](/guide/api-environment-instances#separate-module-graphs) +- `server.reloadModule(module)` -> `environment.reloadModule(module)` +- `server.pluginContainer` -> `environment.pluginContainer` +- `server.transformRequest(url, ssr)` -> `environment.transformRequest(url)` +- `server.warmupRequest(url, ssr)` -> `environment.warmupRequest(url)` +- `server.hot` -> `server.client.environment.hot` diff --git a/changes/shared-plugins-during-build.md b/changes/shared-plugins-during-build.md new file mode 100644 index 00000000..37ae6fca --- /dev/null +++ b/changes/shared-plugins-during-build.md @@ -0,0 +1,81 @@ +# ビルド時の共有プラグイン + +::: tip フィードバック +[Environment API feedback discussion](https://github.com/vitejs/vite/discussions/16358)でフィードバックをお寄せください。 +::: + +[ビルド時の共有プラグイン](/guide/api-environment-plugins.md#shared-plugins-during-build)を参照してください。 + +影響範囲: `Vite プラグイン作成者` + +::: warning 将来のデフォルト変更 +`builder.sharedConfigBuild` は `v6.0` で初めて導入されました。これを true に設定することで、プラグインが共有コンフィグでどのように動作するかをチェックできます。プラグインエコシステムの準備が整ったら、将来のメジャーバージョンでデフォルトを変更するためのフィードバックを求めています。 +::: + +## 動機 + +開発とビルドのプラグインパイプラインを調整します。 + +## 移行ガイド + +環境をまたいでプラグインを共有できるようにするには、プラグインの状態を現在の環境でキー付けする必要があります。以下の形式のプラグインは、すべての環境における変換されたモジュールの数を数えます。 + +```js +function CountTransformedModulesPlugin() { + let transformedModules + return { + name: 'count-transformed-modules', + buildStart() { + transformedModules = 0 + }, + transform(id) { + transformedModules++ + }, + buildEnd() { + console.log(transformedModules) + }, + } +} +``` + +代わりに、各環境で変換されたモジュールの数を数えたい場合は、マップを保持する必要があります。 + +```js +function PerEnvironmentCountTransformedModulesPlugin() { + const state = new Map() + return { + name: 'count-transformed-modules', + perEnvironmentStartEndDuringDev: true, + buildStart() { + state.set(this.environment, { count: 0 }) + } + transform(id) { + state.get(this.environment).count++ + }, + buildEnd() { + console.log(this.environment.name, state.get(this.environment).count) + } + } +} +``` + +このパターンを簡素化するために、Vite は `perEnvironmentState` ヘルパーをエクスポートしています: + +```js +function PerEnvironmentCountTransformedModulesPlugin() { + const state = perEnvironmentState<{ count: number }>(() => ({ count: 0 })) + return { + name: 'count-transformed-modules', + perEnvironmentStartEndDuringDev: true, + buildStart() { + state(this).count = 0 + } + transform(id) { + state(this).count++ + }, + buildEnd() { + console.log(this.environment.name, state(this).count) + } + } +} +``` diff --git a/changes/ssr-using-modulerunner.md b/changes/ssr-using-modulerunner.md new file mode 100644 index 00000000..55f01049 --- /dev/null +++ b/changes/ssr-using-modulerunner.md @@ -0,0 +1,23 @@ +# `ModuleRunner` API を使った SSR + +::: tip フィードバック +[Environment API feedback discussion](https://github.com/vitejs/vite/discussions/16358)でフィードバックをお寄せください。 +::: + +`server.ssrLoadModule` は [Module Runner](/guide/api-environment#modulerunner) からのインポートに置き換えられました。 + +影響範囲: `Vite プラグイン作成者` + +::: warning 将来の廃止予定 +`ModuleRunner` は `v6.0` で初めて導入されました。`server.ssrLoadModule` の廃止は将来のメジャーバージョンで予定されています。使用状況を明確にするため、vite config で `future.removeSsrLoadModule` を `"warn"` に設定してください。 +::: + +## 動機 + +`server.ssrLoadModule(url)` は `ssr` 環境でのモジュールインポートのみを許可し、Vite 開発サーバーと同じプロセスでのみモジュールを実行できます。カスタム環境を持つアプリケーションでは、各環境は `ModuleRunner` と関連付けられ、個別のスレッドまたはプロセスで実行される場合があります。モジュールをインポートするには、`moduleRunner.import(url)` を使用します。 + +## 移行ガイド + +[Environment API フレームワークガイド](../guide/api-environment-frameworks.md)をご覧ください。 + +`server.ssrFixStacktrace` と `server.ssrRewriteStacktrace` は Module Runner API を使用する際に呼び出す必要がありません。`sourcemapInterceptor` が `false` に設定されない限り、スタックトレースは更新されます。 diff --git a/changes/this-environment-in-hooks.md b/changes/this-environment-in-hooks.md new file mode 100644 index 00000000..a103aa66 --- /dev/null +++ b/changes/this-environment-in-hooks.md @@ -0,0 +1,43 @@ +# フック内の `this.environment` + +::: tip フィードバック +[Environment API feedback discussion](https://github.com/vitejs/vite/discussions/16358)でフィードバックをお寄せください。 +::: + +Vite 6 以前は `client` と `ssr` という 2 つの環境しか利用できませんでした。`resolveId`、`load`、`transform` プラグインフックの `options.ssr` 引数によって、プラグインフックでモジュールを処理する際に、プラグイン作成者はこの 2 つの環境を区別することができました。Vite 6 では、Vite アプリケーションは必要に応じて任意の数の名前付き環境を定義できます。プラグインコンテキストに `this.environment` を導入し、フック内で現在のモジュールの環境と対話できるようにします。 + +影響範囲: `Vite プラグイン作成者` + +::: warning 将来の廃止予定 +`this.environment` は `v6.0` で導入されました。`options.ssr` の廃止は将来のメジャーバージョンで予定されています。その時点で、新しい API を使うようにプラグインを移行することを推奨します。使用状況を明確にするために、vite の設定で `future.removePluginHookSsrArgument` を `"warn"` に設定してください。 +::: + +## 動機 + +`this.environment` はプラグインフックの実装に現在の環境名を知らせるだけでなく、環境設定オプション、モジュールグラフ情報、トランスフォームパイプライン (`environment.config`, `environment.moduleGraph`, `environment.transformRequest()`) にもアクセスできるようにします。環境インスタンスをコンテキストで利用できるようにすることで、プラグイン作成者は開発サーバー全体への依存を避けることができます(通常は `configureServer` フックによって起動時にキャッシュされます)。 + +## 移行ガイド + +既存のプラグインを素早くマイグレーションするには、`resolveId`、`load`、`transform` フックの `options.ssr` 引数を `this.environment.config.consumer === 'server'` に置き換えてください: + +```ts +import { Plugin } from 'vite' + +export function myPlugin(): Plugin { + return { + name: 'my-plugin', + resolveId(id, importer, options) { + const isSSR = options.ssr // [!code --] + const isSSR = this.environment.config.consumer === 'server' // [!code ++] + + if (isSSR) { + // SSR 固有のロジック + } else { + // クライアント固有のロジック + } + }, + } +} +``` + +より堅牢で長期的な実装のために、プラグインフックは環境名に依存するのではなく、きめ細かい環境オプションを使って[複数の環境](/guide/api-environment-plugins.html#accessing-the-current-environment-in-hooks)を扱うべきです。 diff --git a/config/build-options.md b/config/build-options.md index a52b0a92..9dd890d8 100644 --- a/config/build-options.md +++ b/config/build-options.md @@ -1,58 +1,66 @@ # ビルドオプション +特に記載がない限り、このセクションのオプションはビルドにのみ適用されます。 + ## build.target - **型:** `string | string[]` -- **デフォルト:** `'modules'` -- **関連:** [ブラウザの互換性](/guide/build#ブラウザの互換性) - -最終的なバンドルのブラウザ互換性のターゲット。デフォルトは Vite の特別な値 `'modules'` で、これは[ネイティブ ES モジュール](https://caniuse.com/es6-module)、[ネイティブ ESM の動的インポート](https://caniuse.com/es6-module-dynamic-import)、[`import.meta`](https://caniuse.com/mdn-javascript_operators_import_meta)をサポートするブラウザを対象にします。 +- **デフォルト:** `'baseline-widely-available'` +- **関連:** [ブラウザーの互換性](/guide/build#browser-compatibility) -もうひとつの特別な値は `'esnext'` で、これはネイディブの動的インポートをサポートしていることを前提としており、トランスパイルが可能な限り少なくなります: +最終的なバンドルのブラウザー互換性のターゲット。デフォルトは Vite の特別な値 `'baseline-widely-available'` で、これは [Baseline](https://web-platform-dx.github.io/web-features/) Widely Available on 2025-05-01 に含まれるブラウザーを対象にします。具体的には `['chrome107', 'edge107', 'firefox104', 'safari16']` です。 -- [`build.minify`](#build-minify) が `'terser'` の場合、`'esnext'` は強制的に `'es2021'` に下げられます。 -- それ以外の場合、トランスパイルはまったく行なわれません。 +もうひとつの特別な値は `'esnext'` で、これはネイディブの動的インポートをサポートしていることを前提としており、最小限のトランスパイルのみが実行されます。 -変換は esbuild で実行され、この値は有効な [esbuild の target オプション](https://esbuild.github.io/api/#target)でなければいけません。カスタムターゲットは ES のバージョン(例: `es2015`)、バージョン付きのブラウザ(例: `chrome58`)、または複数のターゲットの文字列の配列を指定できます。 +変換は esbuild で実行され、この値は有効な [esbuild の target オプション](https://esbuild.github.io/api/#target)でなければいけません。カスタムターゲットは ES のバージョン(例: `es2015`)、バージョン付きのブラウザー(例: `chrome58`)、または複数のターゲットの文字列の配列を指定できます。 esbuild で安全にトランスパイルできない機能がコードに含まれていると、ビルドが失敗するので注意してください。詳細は [esbuild のドキュメント](https://esbuild.github.io/content-types/#javascript)を参照してください。 ## build.modulePreload - **型:** `boolean | { polyfill?: boolean, resolveDependencies?: ResolveModulePreloadDependenciesFn }` -- **デフォルト:** `true` +- **デフォルト:** `{ polyfill: true }` -デフォルトでは、[module preload polyfill](https://guybedford.com/es-module-preloading-integrity#modulepreload-polyfill) が自動的に注入されます。Polyfill は各 `index.html` エントリのプロキシモジュールに自動注入されます。ビルドが `build.rollupOptions.input` を通して非 HTML のカスタムエントリを使用するように設定されている場合は、カスタムエントリで Polyfill を手動でインポートする必要があります: +デフォルトでは、[module preload polyfill](https://guybedford.com/es-module-preloading-integrity#modulepreload-polyfill) が自動的に注入されます。Polyfill は各 `index.html` エントリーのプロキシモジュールに自動注入されます。ビルドが `build.rollupOptions.input` を通して非 HTML のカスタムエントリーを使用するように設定されている場合は、カスタムエントリーで Polyfill を手動でインポートする必要があります: ```js import 'vite/modulepreload-polyfill' ``` -注意: この Polyfill は[ライブラリモード](/guide/build#ライブラリモード)には **適用されません** 。ネイティブの動的インポートを持たないブラウザをサポートする必要がある場合は、ライブラリでの使用は避けた方が良いでしょう。 +注意: この Polyfill は[ライブラリーモード](/guide/build#library-mode)には **適用されません** 。ネイティブの動的インポートを持たないブラウザーをサポートする必要がある場合は、ライブラリーでの使用は避けた方が良いでしょう。 ポリフィルは `{ polyfill: false }` を使って無効にできます。 -動的インポートごとにプリロードするチャンクのリストは Vite によって計算されます。デフォルトでは、これらの依存関係を読み込む際に `base` を含む絶対パスが使用されます。`base` が相対パス (`''` または `'./'`) の場合、最終的にデプロイされるベースに依存する絶対パスを避けるために、実行時に `import.meta.url` が使用されます。 +動的インポートごとにプリロードするチャンクのリストは Vite によって計算されます。デフォルトでは、これらの依存関係を読み込む際に `base` を含む絶対パスが使用されます。`base` が相対パス(`''` または `'./'`)の場合、最終的にデプロイされるベースに依存する絶対パスを避けるために、実行時に `import.meta.url` が使用されます。 -実験的に、`resolveDependencies` 関数を使用して、依存関係のリストとそのパスを細かく制御できるようになりました。この関数は `ResolveModulePreloadDependenciesFn` 型の関数が必要です。 +実験的に、`resolveDependencies` 関数を使用して、依存関係のリストとそのパスを細かく制御できるようになりました。[フィードバックをしてください](https://github.com/vitejs/vite/discussions/13841)。この関数は `ResolveModulePreloadDependenciesFn` 型の関数が必要です。 ```ts type ResolveModulePreloadDependenciesFn = ( url: string, deps: string[], context: { - importer: string + hostId: string + hostType: 'html' | 'js' }, -) => (string | { runtime?: string })[] +) => string[] ``` -`resolveDependencies` 関数は動的インポートごとに依存するチャンクのリストとともに呼び出され、またエントリー HTML ファイルでインポートされたチャンクに対しても呼び出されます。新しい依存関係の配列は、これらのフィルタリングされた依存関係、あるいはそれ以上の依存関係を注入し、そのパスを修正した新しい依存関係配列を返すことができます。`deps` のパスは `build.outDir` からの相対パスです。`hostType === 'js'` の場合は `hostId` への相対パスを返すことができます。この場合、このモジュールを HTML ヘッドにプリロードする際に、絶対パスを取得するために `new URL(dep, import.meta.url)` が使用されます。 +`resolveDependencies` 関数は動的インポートごとに依存するチャンクのリストとともに呼び出され、またエントリー HTML ファイルでインポートされたチャンクに対しても呼び出されます。新しい依存関係の配列は、これらのフィルタリングされた依存関係、あるいはそれ以上の依存関係を注入し、そのパスを修正した新しい依存関係配列を返すことができます。`deps` のパスは `build.outDir` からの相対パスです。返り値は `build.outDir` からの相対パスでなければなりません。 -```js +```js twoslash +/** @type {import('vite').UserConfig} */ +const config = { + // prettier-ignore + build: { +// ---cut-before--- modulePreload: { resolveDependencies: (filename, deps, { hostId, hostType }) => { return deps.filter(condition) - } + }, +}, +// ---cut-after--- + }, } ``` @@ -71,26 +79,28 @@ modulePreload: { - **型:** `string` - **デフォルト:** `dist` -出力ディレクトリを指定します([プロジェクトルート](/guide/#index-html-とプロジェクトルート)からの相対パス)。 +出力ディレクトリーを指定します([プロジェクトルート](/guide/#index-html-and-project-root)からの相対パス)。 ## build.assetsDir - **型:** `string` - **デフォルト:** `assets` -生成されたアセットをネストするディレクトリを指定します(`build.outDir` からの相対パス)。 +生成されたアセットをネストするディレクトリーを指定します(`build.outDir` からの相対パス。[ライブラリーモード](/guide/build#library-mode)では使用しません)。 ## build.assetsInlineLimit -- **型:** `number` -- **デフォルト:** `4096` (4kb) +- **型:** `number` | `((filePath: string, content: Buffer) => boolean | undefined)` +- **デフォルト:** `4096` (4 KiB) インポートもしくは参照されたアセットでこの閾値より小さいものは、余計な HTTP リクエストを避けるために base64 URL としてインライン化されます。`0` に設定するとインライン化は完全に無効になります。 -Git LFS のプレースホルダは、それが表すファイルの内容を含んでいないため、自動的にインライン化の対象から除外されます。 +コールバックが渡された場合、オプトインまたはオプトアウトのためにブール値を返せます。何も返されない場合、デフォルトのロジックが適用されます。 + +Git LFS のプレースホルダーは、それが表すファイルの内容を含んでいないため、自動的にインライン化の対象から除外されます。 ::: tip 注意 -`build.lib` を指定すると `build.assetsInlineLimit` は無視され、ファイルサイズや Git LFS のプレースホルダであるかどうかに関係なく、アセットは常にインライン化されます。 +`build.lib` を指定すると `build.assetsInlineLimit` は無視され、ファイルサイズや Git LFS のプレースホルダーであるかどうかに関係なく、アセットは常にインライン化されます。 ::: ## build.cssCodeSplit @@ -98,7 +108,7 @@ Git LFS のプレースホルダは、それが表すファイルの内容を含 - **型:** `boolean` - **デフォルト:** `true` -CSS コード分割を有効/無効にします。有効にすると、非同期のチャンクでインポートされた CSS は非同期チャンク自体の中にインライン化され、チャンクがロードされるときに挿入されます。 +CSS コード分割を有効/無効にします。有効にすると、非同期 JS チャンクでインポートされた CSS はチャンクとして保存され、チャンクがフェッチされるときに一緒にフェッチされます。 無効にした場合、プロジェクト全体のすべての CSS はひとつの CSS ファイルに抽出されます。 @@ -111,24 +121,31 @@ CSS コード分割を有効/無効にします。有効にすると、非同期 - **型:** `string | string[]` - **デフォルト:** [`build.target`](#build-target) と同じ -このオプションを使用すると、CSS ミニファイのブラウザターゲットを、JavaScript の変換に使用されるものと違う設定にできます。 +このオプションを使用すると、CSS ミニファイのブラウザーターゲットを、JavaScript の変換に使用されるものと違う設定にできます。 -これは主流でないブラウザをターゲットにしている場合にのみ使用してください。 +これは主流でないブラウザーをターゲットにしている場合にのみ使用してください。 例えば Android の WeChat WebView は、ほとんどのモダンな JavaScript の機能をサポートしていますが、[CSS の `#RGBA` 16 進表記](https://developer.mozilla.org/ja/docs/Web/CSS/color_value#rgb_色)はサポートしていません。 この場合、Vite が `rgba()` の色を `#RGBA` の 16 進表記に変換するのを防ぐために、`build.cssTarget` を `chrome61` に設定する必要があります。 +## build.cssMinify + +- **型:** `boolean | 'esbuild' | 'lightningcss'` +- **デフォルト:** クライアントは [`build.minify`](#build-minify) と同じで、SSR は `'esbuild'` + +このオプションによって、デフォルトの `build.minify` を使うのではなく、CSS ミニファイを具体的に上書きすることで、JS と CSS のミニファイを別々に設定できるようになります。Vite はデフォルトでは `esbuild` を使用して CSS をミニファイしています。`'lightningcss'` を指定すると代わりに [Lightning CSS](https://lightningcss.dev/minification.html) を使用します。指定した場合は、 [`css.lightningcss`](./shared-options.md#css-lightningcss) を使用して設定ができます。 + ## build.sourcemap - **型:** `boolean | 'inline' | 'hidden'` - **デフォルト:** `false` -本番用のソースマップを作成します。`true` の場合、ソースマップファイルは別に作られます。`inline` の場合、ソースマップは出力結果ファイルにデータ URI として追加されます。`hidden` は `true` と同様に動作しますが、バンドルファイル内のソースマップを指し示すコメントは削除されます。 +本番用のソースマップを作成します。`true` の場合、ソースマップファイルは別に作られます。`inline` の場合、ソースマップは出力結果ファイルにデータ URI として追加されます。`hidden` は `true` と同様に動作しますが、バンドルファイル内のソースマップを指し示すコメントは記述されません。 ## build.rollupOptions -- **型:** [`RollupOptions`](https://rollupjs.org/guide/en/#big-list-of-options) +- **型:** [`RollupOptions`](https://rollupjs.org/configuration-options/) -基礎となる Rollup バンドルを直接カスタマイズします。これは、Rollup 設定ファイルからエクスポートされるオプションと同じで、Vite 内部の Rollup オプションにマージされます。詳細は [Rollup options docs](https://rollupjs.org/guide/en/#big-list-of-options) を参照してください。 +基礎となる Rollup バンドルを直接カスタマイズします。これは、Rollup 設定ファイルからエクスポートされるオプションと同じで、Vite 内部の Rollup オプションにマージされます。詳細は [Rollup options docs](https://rollupjs.org/configuration-options/) を参照してください。 ## build.commonjsOptions @@ -145,10 +162,28 @@ CSS コード分割を有効/無効にします。有効にすると、非同期 ## build.lib -- **型:** `{ entry: string | string[] | { [entryAlias: string]: string }, name?: string, formats?: ('es' | 'cjs' | 'umd' | 'iife')[], fileName?: string | ((format: ModuleFormat, entryName: string) => string) }` -- **関連:** [ライブラリモード](/guide/build#ライブラリモード) +- **型:** `{ entry: string | string[] | { [entryAlias: string]: string }, name?: string, formats?: ('es' | 'cjs' | 'umd' | 'iife')[], fileName?: string | ((format: ModuleFormat, entryName: string) => string), cssFileName?: string }` +- **関連:** [ライブラリーモード](/guide/build#library-mode) + +ライブラリーとしてビルドします。ライブラリーではエントリーとして HTML を使用できないため、`entry` が必要です。`name` は公開されているグローバル変数で、`formats` に `'umd'` や `'iife'` が含まれている場合に必要です。 -ライブラリとしてビルドします。ライブラリではエントリとして HTML を使用できないため、`entry` が必要です。`name` は公開されているグローバル変数で、`formats` に `'umd'` や `'iife'` が含まれている場合に必要です。デフォルトの `formats` は `['es', 'umd']` で、複数のエントリを使用する場合は `['es', 'cjs']` です。`fileName` は出力されるパッケージファイルの名前です。デフォルトの `fileName` は package.json の name オプションですが、`format` と `entryAlias` を引数にとる関数として定義することもできます。 +`fileName` はパッケージファイルの出力名で、デフォルトでは `package.json` の `"name"` となります。 また、`format` と `entryName` を引数として受け取り、ファイル名を返す関数として定義することもできます。 + +パッケージが CSS をインポートしている場合、`cssFileName` を使用して出力される CSS ファイルの名前を指定できます。文字列が設定されている場合は、デフォルトで `fileName` と同じ値になります。それ以外の場合、`package.json` の `"name"` にフォールバックします。 + +```js twoslash [vite.config.js] +import { defineConfig } from 'vite' + +export default defineConfig({ + build: { + lib: { + entry: ['src/main.js'], + fileName: (format, entryName) => `my-lib-${entryName}.${format}.js`, + cssFileName: 'my-lib-style', + }, + }, +}) +``` ## build.manifest @@ -156,32 +191,50 @@ CSS コード分割を有効/無効にします。有効にすると、非同期 - **デフォルト:** `false` - **関連:** [バックエンドとの統合](/guide/backend-integration) -`true` に設定すると、ビルドはハッシュ化されていないアセットファイル名とハッシュ化されたバージョンのマッピングを含む `manifest.json` ファイルを生成するようになり、サーバフレームワークがこれを使用して正しいアセットリンクをレンダリングできるようになります。値が文字列の場合は、それがマニフェストファイル名として使われます。 +ハッシュ化されていないアセットファイル名からハッシュ化されたバージョンへのマッピングを含むマニフェストファイルを生成するかどうか。これを利用すると、サーバーフレームワークが正しいアセットリンクをレンダリングできるようになります。 + +値が文字列の場合は、その値をマニフェストファイルの `build.outDir` からの相対パスとして使用します。`true` に設定すると、パスは `.vite/manifest.json` になります。 ## build.ssrManifest - **型:** `boolean | string` - **デフォルト:** `false` -- **関連:** [サーバサイドレンダリング](/guide/ssr) +- **関連:** [サーバーサイドレンダリング](/guide/ssr) -`true` に設定すると、本番環境でのスタイルリンクやアセットプリロードディレクティブを決定するための SSR マニフェストもビルドで生成されます。値が文字列の場合は、それがマニフェストファイル名として使われます。 +本番環境でのスタイルリンクやアセットプリロードディレクティブを決定するための SSR マニフェストファイルを生成するかどうか。 + +値が文字列の場合は、その値をマニフェストファイルの `build.outDir` からの相対パスとして使用します。`true` に設定すると、パスは `.vite/ssr-manifest.json` になります。 ## build.ssr - **型:** `boolean | string` -- **デフォルト:** `undefined` -- **関連:** [サーバサイドレンダリング](/guide/ssr) +- **デフォルト:** `false` +- **関連:** [サーバーサイドレンダリング](/guide/ssr) -SSR 向けのビルドを生成します。この値は、SSR エントリを直接指定する文字列か、`true` にして `rollupOptions.input` で SSR エントリを指定する必要があります。 +SSR 向けのビルドを生成します。この値は、SSR エントリーを直接指定する文字列か、`true` にして `rollupOptions.input` で SSR エントリーを指定する必要があります。 + +## build.emitAssets + +- **型:** `boolean` +- **デフォルト:** `false` + +クライアント以外のビルド時、静的アセットはクライアントビルドの一部として生成されると仮定されているため、出力されません。このオプションは、フレームワークが他の環境のビルドで静的アセットを強制的に出力することを可能にします。ビルド後のステップでアセットをマージするのはフレームワークの責任です。 + +## build.ssrEmitAssets + +- **型:** `boolean` +- **デフォルト:** `false` + +SSR ビルドの間、静的アセットはクライアントビルドの一部として出力されると想定されているため、出力されません。このオプションを使用すると、フレームワークはクライアントと SSR ビルドの両方でアセットを出力することを強制できます。フレームワークは、ビルド後のステップでアセットをマージする責任があります。このオプションは Environment API が安定したら `build.emitAssets` に置き換えられます。 ## build.minify - **型:** `boolean | 'terser' | 'esbuild'` -- **デフォルト:** `'esbuild'` +- **デフォルト:** クライアントビルドは `'esbuild'`、SSR ビルドでは `false` ミニファイを無効にするには `false` を設定するか、使用するミニファイツールを指定します。デフォルトは [esbuild](https://github.com/evanw/esbuild) で、これは terser に比べて 20~40 倍速く、圧縮率は 1~2%だけ低下します。[ベンチマーク](https://github.com/privatenumber/minification-benchmarks) -pure アノテーションを取り除きツリーシェイクをできなくするため、ライブラリモードで `'es'` フォーマットを使用する場合、`build.minify` オプションは空白文字をミニファイしないので注意してください。 +pure アノテーションを取り除きツリーシェイクをできなくするため、ライブラリーモードで `'es'` フォーマットを使用する場合、`build.minify` オプションは空白文字をミニファイしないので注意してください。 `'terser'` を設定したときには、terser のインストールが必要です。 @@ -195,6 +248,8 @@ npm add -D terser Terser に渡す追加の[ミニファイオプション](https://terser.org/docs/api-reference#minify-options)です。 +さらに、`maxWorkers: number` オプションを渡して、生成するワーカーの最大数を指定することもできます。デフォルトは CPU の数から 1 を引いた数です。 + ## build.write - **型:** `boolean` @@ -211,7 +266,6 @@ Terser に渡す追加の[ミニファイオプション](https://terser.org/doc ## build.copyPublicDir -- **実験的機能** - **型:** `boolean` - **デフォルト:** `true` @@ -229,14 +283,14 @@ gzip 圧縮されたサイズレポートを有効/無効にします。大き - **型:** `number` - **デフォルト:** `500` -チャンクサイズ警告の制限値(kb 単位)。 +チャンクサイズ警告の制限値(kB 単位)。[JavaScript のサイズ自体が実行時間に関係する](https://v8.dev/blog/cost-of-javascript-2019)ため、非圧縮のチャンクサイズと比較されます。 ## build.watch -- **型:** [`WatcherOptions`](https://rollupjs.org/guide/en/#watch-options)`| null` +- **型:** [`WatcherOptions`](https://rollupjs.org/configuration-options/#watch)`| null` - **デフォルト:** `null` -Rollup ウォッチャを有効にするには、`{}` に設定します。これは主に、ビルドのみのプラグインや統合プロセスを伴うケースで使用されます。 +Rollup ウォッチャーを有効にするには、`{}` に設定します。これは主に、ビルドのみのプラグインや統合プロセスを伴うケースで使用されます。 ::: warning Windows Subsystem for Linux (WSL) 2 上での Vite の実行 diff --git a/config/dep-optimization-options.md b/config/dep-optimization-options.md index 3bae080e..3040409b 100644 --- a/config/dep-optimization-options.md +++ b/config/dep-optimization-options.md @@ -2,15 +2,17 @@ - **関連:** [依存関係の事前バンドル](/guide/dep-pre-bundling) -## optimizeDeps.entries +特に記載がない限り、このセクションのオプションは、開発時にだけ使用される依存関係の最適化にのみ適用されます。 + +## optimizeDeps.entries - **型:** `string | string[]` -デフォルトでは、Vite はすべての `.html` ファイルをクロールして、事前にバンドルする必要のある依存関係を検出します(`node_modules`, `build.outDir`, `__tests__` および `coverage` は無視します)。`build.rollupOptions.input` が指定されている場合、Vite は代わりにそれらのエントリポイントをクロールします。 +デフォルトでは、Vite はすべての `.html` ファイルをクロールして、事前にバンドルする必要のある依存関係を検出します(`node_modules`, `build.outDir`, `__tests__` および `coverage` は無視します)。`build.rollupOptions.input` が指定されている場合、Vite は代わりにそれらのエントリーポイントをクロールします。 -これらのいずれもニーズに合わない場合、このオプションを使ってカスタムエントリを指定することができます。値は Vite プロジェクトルートからの相対的な [fast-glob パターン](https://github.com/mrmlnc/fast-glob#basic-syntax) か、パターンの配列でなければいけません。これによりデフォルトのエントリの推論が上書きされます。`optimizeDeps.entries` が明示的に定義されている場合、デフォルトでは `node_modules` と `build.outDir` フォルダのみが無視されます。他のフォルダを無視したい場合は、最初の `!` でマークした無視パターンをエントリリストの一部として使用できます。 +これらのいずれもニーズに合わない場合、このオプションを使ってカスタムエントリーを指定することができます。値は Vite プロジェクトルートからの相対的な [`tinyglobby` パターン](https://github.com/SuperchupuDev/tinyglobby) か、パターンの配列でなければいけません。これによりデフォルトのエントリーの推論が上書きされます。`optimizeDeps.entries` が明示的に定義されている場合、デフォルトでは `node_modules` と `build.outDir` フォルダーのみが無視されます。他のフォルダーを無視したい場合は、最初の `!` でマークした無視パターンをエントリーリストの一部として使用できます。`node_modules` を明示的に含むパターンに対しては、`node_modules` は無視されません。 -## optimizeDeps.exclude +## optimizeDeps.exclude - **型:** `string[]` @@ -19,7 +21,9 @@ :::warning CommonJS CommonJS の依存関係を最適化から除外してはいけません。ESM の依存関係が最適化から除外されているが、ネストされた CommonJS の依存関係がある場合は、CommonJS の依存関係を `optimizeDeps.include` に追加する必要があります。例: -```js +```js twoslash +import { defineConfig } from 'vite' +// ---cut--- export default defineConfig({ optimizeDeps: { include: ['esm-dep > cjs-dep'], @@ -29,25 +33,84 @@ export default defineConfig({ ::: -## optimizeDeps.include +## optimizeDeps.include - **型:** `string[]` デフォルトでは、リンクされたパッケージのうち `node_modules` の外にあるものは事前バンドルされません。このオプションを使用してリンクされたパッケージを強制的に事前バンドルします。 -## optimizeDeps.esbuildOptions +**実験的機能:** 多くのディープインポートを持つライブラリーを使用している場合、末尾に glob パターンを指定して、すべてのディープインポートを一度に事前バンドルすることもできます。これにより、新たにディープインポートが使用されるたびに常に事前バンドルされることを避けることができます。[フィードバックをしてください](https://github.com/vitejs/vite/discussions/15833)。例: -- **型:** [`EsbuildBuildOptions`](https://esbuild.github.io/api/#simple-options) +```js twoslash +import { defineConfig } from 'vite' +// ---cut--- +export default defineConfig({ + optimizeDeps: { + include: ["my-lib/components/**/*.vue"], + }, +}); +``` +## optimizeDeps.esbuildOptions + +- **型:** [`Omit`](https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys)`<`[`EsbuildBuildOptions`](https://esbuild.github.io/api/#general-options)`, +| 'bundle' +| 'entryPoints' +| 'external' +| 'write' +| 'watch' +| 'outdir' +| 'outfile' +| 'outbase' +| 'outExtension' +| 'metafile'>` + 依存関係のスキャンと最適化の際、 esbuild に渡すオプション。 -いくつかのオプションは、変更すると Vite の依存関係最適化と互換性がなくなるため、省略されています。 +いくつかのオプションは、変更すると Vite の依存関係の最適化と互換性がなくなるため、省略されています。 - `external` も省略されています。Vite の `optimizeDeps.exclude` オプションを使用してください - `plugins` は Vite の依存関係プラグインとマージされます -## optimizeDeps.force +## optimizeDeps.force - **型:** `boolean` `true` に設定すると、前にキャッシュされた最適化された依存関係を無視して、依存関係の事前バンドルをするよう強制します。 + +## optimizeDeps.noDiscovery + +- **型:** `boolean` +- **デフォルト:** `false` + +`true` に設定すると、自動的な依存関係の発見が無効化され、`optimizeDeps.include` に指定された依存関係だけが最適化されます。CJS のみの依存関係は、開発中に `optimizeDeps.include` に存在している必要があります。 + +## optimizeDeps.holdUntilCrawlEnd + +- **実験的機能:** [フィードバックをしてください](https://github.com/vitejs/vite/discussions/15834) +- **型:** `boolean` +- **デフォルト:** `true` + +有効化すると、コールドスタート時にすべての静的インポートがクロールされるまで、最初に最適化された依存関係の結果を保持します。これにより、新しい依存関係が発見されて、それが新しい共通チャンクの生成をトリガーしたときに、ページ全体をリロードする必要がなくなります。もしすべての依存関係が `include` で明示的に定義されていて、それらがすべてスキャナーで検出された場合は、このオプションを無効化して、ブラウザープロセスがより多くのリクエストを並列に処理できるようにすることをおすすめします。 + +## optimizeDeps.disabled + +- **非推奨** +- **実験的機能:** [フィードバックをしてください](https://github.com/vitejs/vite/discussions/13839) +- **型:** `boolean | 'build' | 'dev'` +- **デフォルト:** `'build'` + +このオプションは非推奨です。Vite 5.1 時点で、ビルド中の依存関係の事前バンドルは削除されています。`optimizeDeps.disabled` を `true` または `'dev'` に設定するとオプティマイザーが無効になり、`false` または `'build'` に設定すると開発中のオプティマイザーは有効のままになります。 + +オプティマイザーを完全に無効化するには、`optimizeDeps.noDiscovery: true` を使用して依存関係の自動検出を禁止し、`optimizeDeps.include` を undefined または空のままにしてください。 + +:::warning +ビルド時の依存関係の最適化は**実験的な**機能でした。この戦略を試したプロジェクトでは、`build.commonjsOptions: { include: [] }` を使用して `@rollup/plugin-commonjs` も削除しました。もし削除していた場合、バンドル中に CJS のみのパッケージをサポートするために、再び有効にするよう警告が表示されます。 +::: + +## optimizeDeps.needsInterop + +- **実験的機能** +- **型:** `string[]` + +依存関係をインポートする際に、ESM の相互作用を強制します。Vite は依存関係が相互作用を必要とする場合に適切に検出することができるため、このオプションは一般的には必要ありません。しかし、依存関係の組み合わせが異なると、いくつかのパッケージが異なる形で事前にバンドルされる可能性があります。これらのパッケージを `needsInterop` に追加すると、全ページの再読み込みを回避してコールドスタートを高速化することができます。依存関係のあるパッケージがそうである場合、警告が表示され、パッケージ名を設定内のこの配列に追加するよう提案されます。 diff --git a/config/index.md b/config/index.md index fa4c87f2..7a06d6b8 100644 --- a/config/index.md +++ b/config/index.md @@ -2,20 +2,19 @@ title: Vite の設定 --- -# Vite の設定 +# Vite の設定 {#configuring-vite} -コマンドラインから `vite` を実行すると、Vite は[プロジェクトルート](/guide/#index-html-とプロジェクトルート)内の `vite.config.js` という名前の設定ファイルを自動的に解決しようとします。 +コマンドラインから `vite` を実行すると、Vite は[プロジェクトルート](/guide/#index-html-and-project-root)内の `vite.config.js` という名前の設定ファイルを自動的に解決しようとします(その他の JS および TS の拡張子もサポートされています)。 最も基本的な設定ファイルは次のようになります: -```js -// vite.config.js +```js [vite.config.js] export default { // 設定オプション } ``` -`package.json` に `type: "module"` などでプロジェクトがネイティブな Node ESM を使用していない場合でも、Vite は設定ファイルで ES モジュール構文の使用をサポートしています。この場合、設定ファイルはロードの前に自動的に前処理されます。 +`package.json` に `"type": "module"` などでプロジェクトがネイティブな Node ESM を使用していない場合でも、Vite は設定ファイルで ES モジュール構文の使用をサポートしています。この場合、設定ファイルはロードの前に自動的に前処理されます。 また、CLI の `--config` オプションで、使用するコンフィグファイルを明示的に指定することもできます(`cwd` からの相対的な解決): @@ -23,6 +22,12 @@ export default { vite --config my-config.js ``` +::: tip 設定の読み込み +デフォルトでは、Vite は `esbuild` を使用して設定を一時ファイルにバンドルし、読み込みます。これはモノレポ内で TypeScript をインポートする際に問題を引き起こす可能性があります。このアプローチで問題が起きた場合は、代わりに [module runner](/guide/api-environment-runtimes.html#modulerunner) を使用するように `--configLoader runner` を指定できます。これにより、一時的な設定が作成されなくなり、すべてのファイルがその場で変換されるようになります。モジュールランナーは設定ファイル内では CJS をサポートしていませんが、外部の CJS パッケージは通常通りに機能するはずです。 + +あるいは、TypeScript をサポートする環境(例:`node --experimental-strip-types`)を使用している場合、またはプレーンな JavaScript のみを記述している場合は、`--configLoader native` を指定して、環境のネイティブランタイムを使用して設定ファイルを読み込むことができます。設定ファイルによってインポートされたモジュールの更新は検出されないため、Vite サーバーは自動的に再起動されないことに注意してください。 +::: + ## 設定の自動補完 Vite には TypeScript の型が同梱されているので、jsdoc のタイプヒントを使って IDE の自動補完を活用できます: @@ -34,7 +39,7 @@ export default { } ``` -あるいは、jsdoc のアノテーションがなくても自動補完を提供する `defineConfig` ヘルパを使用することもできます: +あるいは、jsdoc のアノテーションがなくても自動補完を提供する `defineConfig` ヘルパーを使用することもできます: ```js import { defineConfig } from 'vite' @@ -44,14 +49,24 @@ export default defineConfig({ }) ``` -Vite は TS の設定ファイルも直接サポートしています。`vite.config.ts` を `defineConfig` ヘルパと一緒に使うこともできます。 +Vite は TypeScript の設定ファイルもサポートしています。`vite.config.ts` は、上記の `defineConfig` ヘルパー関数または `satisfies` 演算子とともに使用できます: + +```ts +import type { UserConfig } from 'vite' + +export default { + // ... +} satisfies UserConfig +``` ## 条件付き設定 -コマンド(`dev`/`serve` か `build`)や使用されている[モード](/guide/env-and-mode)や SSR ビルド (`ssrBuild`) かどうかに基づいて条件付きで設定のオプションを決定する必要がある場合は、代わりに関数をエクスポートできます: +設定がコマンド(`serve` や `build`)、使用されている[モード](/guide/env-and-mode#modes)、SSR ビルドかどうか(`isSsrBuild`)、ビルドのプレビューかどうか(`isPreview`)に基づいて条件付きで設定のオプションを決定する必要がある場合は、代わりに関数をエクスポートできます: -```js -export default defineConfig(({ command, mode, ssrBuild }) => { +```js twoslash +import { defineConfig } from 'vite' +// ---cut--- +export default defineConfig(({ command, mode, isSsrBuild, isPreview }) => { if (command === 'serve') { return { // dev 固有の設定 @@ -65,15 +80,17 @@ export default defineConfig(({ command, mode, ssrBuild }) => { }) ``` -Vite の API において `command` の値は、開発時(CLI で `vite`、`vite dev`、`vite serve` がエイリアス)には `serve` となり、本番用にビルド(`vite build`)するときには `build` となることに注意してください。 +Vite の API において `command` の値は、開発時(CLI で [`vite`](/guide/cli#vite)、`vite dev`、`vite serve` がエイリアス)には `serve` となり、本番用にビルド([`vite build`](/guide/cli#vite-build))するときには `build` となることに注意してください。 -`ssrBuild` は実験的です。より普遍的な `ssr` フラグの代わりにビルド時のみ利用できるのは、開発時は、SSR のリクエストも SSR でないリクエストも設定を共有する同じサーバにより処理されているためです。ブラウザと SSR ビルドで別々のコマンドがないツールでは、値が `undefined` になることがあるため、`true` と `false` に対する明示的な比較を使用してください。 +`isSsrBuild` と `isPreview` はそれぞれ `build` コマンドと `serve` コマンドの種類を区別するための追加のオプションフラグです。Vite の設定を読み込むツールの中には、これらのフラグをサポートしておらず、代わりに `undefined` を渡すものもあります。そのため、明示的に `true` と `false` を比較することをおすすめします。 ## 非同期の設定 -設定で非同期の関数を呼び出す必要がある場合は、代わりに async 関数をエクスポートできます: +設定で非同期の関数を呼び出す必要がある場合は、代わりに非同期関数をエクスポートできます。また、この非同期関数は `defineConfig` を通じて渡すことができ、自動補完のサポートを向上させることができます: -```js +```js twoslash +import { defineConfig } from 'vite' +// ---cut--- export default defineConfig(async ({ command, mode }) => { const data = await asyncFunction() return { @@ -82,24 +99,47 @@ export default defineConfig(async ({ command, mode }) => { }) ``` -## 環境変数 +## 環境変数を設定に使用する -通常通り、環境変数は `process.env` から取得することができます。 +設定自体が評価されている間に利用可能な環境変数は、現在のプロセス環境(`process.env`)に既に存在するもののみです。Vite は意図的に `.env*` ファイルの読み込みをユーザー設定が解決される**後**まで遅らせています。これは、読み込むファイルのセットが [`root`](/guide/#index-html-and-project-root) や [`envDir`](/config/shared-options.md#envdir) などの設定オプション、そして最終的な `mode` に依存するためです。 -Vite はデフォルトでは `.env` ファイルをロードしないことに注意してください。ロードするファイルは Vite の設定を評価した後に決定されるからです。例えば、 `root` と `envDir` オプションはロードの動作に影響します。しかし必要に応じて、エクスポートされた `loadEnv` ヘルパーを使用して、特定の `.env` ファイルをロードすることができます。 +つまり、`.env`、`.env.local`、`.env.[mode]`、`.env.[mode].local` で定義された変数は、`vite.config.*` の実行中に `process.env` に自動的に注入されることは**ありません**。これは[環境変数とモード](/guide/env-and-mode.html)で説明されているとおり、これらの変数は後で自動的に読み込まれ、(デフォルトの `VITE_` プレフィックスフィルターを使用して)`import.meta.env` を通じてアプリケーションコードに公開されます。したがって、`.env*` ファイルからアプリに値を渡すだけであれば、設定内で何かを呼び出す必要はありません。 -```js +しかし、`.env*` ファイルの値が設定自体に影響を与える必要がある場合(例えば `server.port` の設定、プラグインの条件付き有効化、`define` 置換の計算など)、エクスポートされた [`loadEnv`](/guide/api-javascript.html#loadenv) ヘルパーを使用して手動で読み込めます。 + +```js twoslash import { defineConfig, loadEnv } from 'vite' -export default defineConfig(({ command, mode }) => { - // `mode` に基づいて現在の作業ディレクトリにある env ファイルをロードする - // `VITE_` プレフィックスに関係なく全ての環境変数をロードするには、第 3 引数に '' を設定します +export default defineConfig(({ mode }) => { + // `mode` に基づいて現在の作業ディレクトリーにある env ファイルをロードする。 + // `VITE_` プレフィックスに関係なく全ての環境変数をロードするには、 + // 第 3 引数に '' を設定します const env = loadEnv(mode, process.cwd(), '') return { - // vite の設定 define: { - __APP_ENV__: env.APP_ENV, + // 環境変数から派生した明示的なアプリレベル定数を提供します。 + __APP_ENV__: JSON.stringify(env.APP_ENV), + }, + // 例:環境変数を使用して開発サーバーのポートを条件付きで設定します。 + server: { + port: env.APP_PORT ? Number(env.APP_PORT) : 5173, }, } }) ``` + +## VS Code で設定ファイルをデバッグする + +デフォルトの `--configLoader bundle` の動作では、Vite は生成された一時的な設定ファイルを `node_modules/.vite-temp` フォルダーに書き込むため、Vite の設定ファイル内でブレークポイントデバッグを設定するときにファイルが見つからないというエラーが発生します。この問題を修正するには、`.vscode/settings.json` に以下の設定を追加してください: + +```json +{ + "debug.javascript.terminalOptions": { + "resolveSourceMapLocations": [ + "${workspaceFolder}/**", + "!**/node_modules/**", + "**/node_modules/.vite-temp/**" + ] + } +} +``` diff --git a/config/preview-options.md b/config/preview-options.md index 7adbb515..20bb519c 100644 --- a/config/preview-options.md +++ b/config/preview-options.md @@ -1,28 +1,39 @@ # プレビューのオプション +特に記載がない限り、このセクションのオプションはプレビューにのみ適用されます。 + ## preview.host - **型:** `string | boolean` - **デフォルト:** [`server.host`](./server-options#server_host) -サーバがリッスンすべき IP アドレスを指定します。 +サーバーがリッスンすべき IP アドレスを指定します。 `0.0.0.0` または `true` に設定すると、LAN やパブリックアドレスを含むすべてのアドレスをリッスンします。 これは CLI で `--host 0.0.0.0` や `--host` を使用して設定できます。 :::tip 注意 -Vite ではなく他のサーバがレスポンスを返す場合があります。 +Vite ではなく他のサーバーがレスポンスを返す場合があります。 詳細は [`server.host`](./server-options.md#server-host) をご覧ください。 ::: +## preview.allowedHosts + +- **型:** `string[] | true` +- **デフォルト:** [`server.allowedHosts`](./server-options#server-allowedhosts) + +Vite が応答することを許可するホスト名。 + +詳細は [`server.allowedHosts`](./server-options#server-allowedhosts) を参照してください。 + ## preview.port - **型:** `number` - **デフォルト:** `4173` -サーバのポートを指定します。このポートがすでに使用されている場合、Vite は次に使用可能なポートを自動的に試すので、サーバが最終的にリッスンする実際のポートとは異なる場合があることに注意してください。 +サーバーのポートを指定します。このポートがすでに使用されている場合、Vite は次に使用可能なポートを自動的に試すので、サーバーが最終的にリッスンする実際のポートとは異なる場合があることに注意してください。 **例:** @@ -46,38 +57,42 @@ export default defineConfig({ ## preview.https -- **型:** `boolean | https.ServerOptions` +- **型:** `https.ServerOptions` - **デフォルト:** [`server.https`](./server-options#server-https) -TLS + HTTP/2 を有効にします。[`server.proxy` オプション](./server-options#server-proxy)も使用されている場合にのみ TLS にダウングレードされるので注意してください。 +TLS + HTTP/2 を有効にします。 -この値は `https.createServer()` に渡される[オプションオブジェクト](https://nodejs.org/api/https.html#https_https_createserver_options_requestlistener)でも構いません。 +詳しくは [`server.https`](./server-options#server-https) を参照してください。 ## preview.open - **型:** `boolean | string` - **デフォルト:** [`server.open`](./server-options#server-open) -サーバ起動時に自動的にブラウザでアプリを開きます。値が文字列の場合、URL のパス名として使用されます。もしあなたの好きなブラウザでアプリを開きたい場合、環境変数 `process.env.BROWSER`(例: `firefox`)を定義できます。詳細は [`open` パッケージ](https://github.com/sindresorhus/open#app) をご覧ください。 +サーバー起動時に自動的にブラウザーでアプリを開きます。値が文字列の場合、URL のパス名として使用されます。もしあなたの好きなブラウザーでアプリを開きたい場合、環境変数 `process.env.BROWSER`(例: `firefox`)を定義できます。詳細は [`open` パッケージ](https://github.com/sindresorhus/open#app) をご覧ください。また、`process.env.BROWSER_ARGS` を設定して、追加の引数を渡すこともできます(例: `--incognito`)。 + +また、`BROWSER` と `BROWSER_ARGS` は `.env` ファイルで設定できる特別な環境変数です。詳しくは [`open` パッケージ](https://github.com/sindresorhus/open#app) を参照してください。 ## preview.proxy - **型:** `Record` - **デフォルト:** [`server.proxy`](./server-options#server-proxy) -プレビューサーバのカスタムプロキシのルールを設定します。`{ key: options }` のペアのオブジェクトが必要です。キーが `^` で始まる場合は `RegExp` として解釈されます。プロキシのインスタンスにアクセスするには `configure` オプションを使用します。 +プレビューサーバーのカスタムプロキシのルールを設定します。`{ key: options }` のペアのオブジェクトが必要です。キーが `^` で始まる場合は `RegExp` として解釈されます。プロキシのインスタンスにアクセスするには `configure` オプションを使用します。 -[`http-proxy`](https://github.com/http-party/node-http-proxy) を使用します。全オプションは[こちら](https://github.com/http-party/node-http-proxy#options)。 +[`http-proxy-3`](https://github.com/sagemathinc/http-proxy-3) を使用します。全オプションは[こちら](https://github.com/sagemathinc/http-proxy-3#options)。 ## preview.cors - **型:** `boolean | CorsOptions` - **デフォルト:** [`server.cors`](./server-options#server-cors) -プレビューサーバの CORS を設定します。これはデフォルトで有効になっており、どんなオリジンも許可します。[オプションオブジェクト](https://github.com/expressjs/cors)を渡して微調整するか、`false` で無効にします。 +プレビューサーバーの CORS を設定します。 + +詳細は [`server.cors`](./server-options#server-cors) をご覧ください。 ## preview.headers - **型:** `OutgoingHttpHeaders` -サーバのレスポンスヘッダを指定します。 +サーバーのレスポンスヘッダーを指定します。 diff --git a/config/server-options.md b/config/server-options.md index 2bfe72bc..aee54c37 100644 --- a/config/server-options.md +++ b/config/server-options.md @@ -1,27 +1,28 @@ -# サーバオプション +# サーバーオプション + +特に記載がない限り、このセクションのオプションは開発にのみ適用されます。 ## server.host - **型:** `string | boolean` - **デフォルト:** `'localhost'` -サーバがリッスンすべき IP アドレスを指定します。 +サーバーがリッスンすべき IP アドレスを指定します。 `0.0.0.0` もしくは `true` に設定すると、LAN やパブリックアドレスを含むすべてのアドレスをリッスンします。 これは CLI で `--host 0.0.0.0` や `--host` を使用して設定できます。 ::: tip 注意 -Vite ではなく他のサーバがレスポンスを返す場合があります。 +Vite ではなく他のサーバーがレスポンスを返す場合があります。 -1 つ目の場合は `localhost` が利用されたときです。Node.js v17 未満はデフォルトでは DNS によって解決された結果のアドレスを並び替えます。`localhost` へアクセスするとき、ブラウザは DNS を利用してアドレスを解決し、そのアドレスは Vite がリッスンしているアドレスと異なる場合があります。アドレスが異なっている場合は Vite は解決したアドレスを表示します。 +1 つ目の場合は `localhost` が利用されたときです。Node.js v17 未満はデフォルトでは DNS によって解決された結果のアドレスを並び替えます。`localhost` へアクセスするとき、ブラウザーは DNS を利用してアドレスを解決し、そのアドレスは Vite がリッスンしているアドレスと異なる場合があります。アドレスが異なっている場合は Vite は解決したアドレスを表示します。 [`dns.setDefaultResultOrder('verbatim')`](https://nodejs.org/api/dns.html#dns_dns_setdefaultresultorder_order) を設定することで、この並び替える動作を無効化できます。そうすると、Vite はアドレスを `localhost` と出力します。 -```js -// vite.config.js +```js twoslash [vite.config.js] import { defineConfig } from 'vite' -import dns from 'dns' +import dns from 'note:dns' dns.setDefaultResultOrder('verbatim') @@ -30,8 +31,46 @@ export default defineConfig({ }) ``` -2 つ目の場合はワイルドカードホスト (例: `0.0.0.0`) が利用されたときです。これは、ワイルドカードでないホストにリッスンしているサーバが、ワイルドカードをリッスンしているサーバよりも優先されるためです。 +2 つ目の場合はワイルドカードホスト(例: `0.0.0.0`)が利用されたときです。これは、ワイルドカードでないホストにリッスンしているサーバーが、ワイルドカードをリッスンしているサーバーよりも優先されるためです。 + +::: + +::: tip LAN から WSL2 上のサーバーにアクセスする + +WSL2 上で Vite を動作させる場合、LAN からサーバーにアクセスするために `host: true` を設定するだけでは不十分です。 +詳しくは [WSL のドキュメント](https://learn.microsoft.com/ja-jp/windows/wsl/networking#accessing-a-wsl-2-distribution-from-your-local-area-network-lan)をご覧ください。 + +::: + +## server.allowedHosts + +- **型:** `string[] | true` +- **デフォルト:** `[]` + +Vite が応答することを許可するホスト名。 +`localhost` と `.localhost` 以下のドメインとすべての IP アドレスはデフォルトで許可されます。 +HTTPS を使用する場合は、このチェックはスキップされます。 + +文字列が `.` で始まる場合、`.` なしのホスト名とそのホスト名配下のすべてのサブドメインを許可します。たとえば、`.example.com` は `example.com`、`foo.example.com`、`foo.bar.example.com` を許可します。`true` に設定した場合、サーバーが任意のホストのリクエストに応答することを許可します。 + +::: details 安全に追加できるホストは何ですか? + +解決先の IP アドレスを制御できるホストは、許可されたホストのリストに追加しても安全です。 + +例えば、`vite.dev` というドメインを所有している場合は、`vite.dev` と `.vite.dev` をリストに追加できます。そのドメインを所有しておらず、そのドメインの所有者を信頼できない場合は、追加しないでください。 + +特に、`.com` のようなトップレベルドメインは絶対にリストへ追加しないでください。これは、誰でも `example.com` のようなドメインを購入し、それが解決する IP アドレスを制御できるためです。 + +::: + +::: danger + +`server.allowedHosts` を `true` に設定すると、任意のウェブサイトが DNS リバインド攻撃により開発サーバーにリクエストを送信できるようになり、ソースコードやコンテンツをダウンロードできるようになります。許可するホストの明示的なリストを常に使用することをお勧めします。詳細は [GHSA-vg6x-rcgg-rjx6](https://github.com/vitejs/vite/security/advisories/GHSA-vg6x-rcgg-rjx6) を参照してください。 + +::: +::: details 環境変数による設定 +環境変数 `__VITE_ADDITIONAL_SERVER_ALLOWED_HOSTS` を設定することで、許可するホストを追加できます。 ::: ## server.port @@ -39,7 +78,7 @@ export default defineConfig({ - **型:** `number` - **デフォルト:** `5173` -サーバのポートを指定します。このポートがすでに使用されている場合、Vite は次に使用可能なポートを自動的に試すので、サーバが最終的にリッスンする実際のポートとは異なる場合があることに注意してください。 +サーバーのポートを指定します。このポートがすでに使用されている場合、Vite は次に使用可能なポートを自動的に試すので、サーバーが最終的にリッスンする実際のポートとは異なる場合があることに注意してください。 ## server.strictPort @@ -49,11 +88,11 @@ export default defineConfig({ ## server.https -- **型:** `boolean | https.ServerOptions` +- **型:** `https.ServerOptions` -TLS + HTTP/2 を有効にします。[`server.proxy` オプション](#server-proxy)も使用されている場合にのみ TLS にダウングレードされるので注意してください。 +TLS + HTTP/2 を有効にします。この値は `https.createServer()` に渡される[オプションオブジェクト](https://nodejs.org/api/https.html#https_https_createserver_options_requestlistener)です。 -この値は `https.createServer()` に渡される[オプションオブジェクト](https://nodejs.org/api/https.html#https_https_createserver_options_requestlistener)でも構いません。 +TLS にダウングレードされるのは、[`server.proxy` オプション](#server-proxy)も使用している場合のみであることに注意してください。 有効な証明書が必要です。基本的なセットアップでは、自己署名証明書を自動的に作成しキャッシュする [@vitejs/plugin-basic-ssl](https://github.com/vitejs/vite-plugin-basic-ssl) をプロジェクトのプラグインに追加することもできます。しかし、独自の証明書を作成することを推奨します。 @@ -61,7 +100,9 @@ TLS + HTTP/2 を有効にします。[`server.proxy` オプション](#server-pr - **型:** `boolean | string` -サーバ起動時に自動的にブラウザでアプリを開きます。値が文字列の場合、URL のパス名として使用されます。もしあなたの好きなブラウザでアプリを開きたい場合、環境変数 `process.env.BROWSER`(例: `firefox`)を定義できます。詳細は [`open` パッケージ](https://github.com/sindresorhus/open#app) をご覧ください。 +サーバー起動時に自動的にブラウザーでアプリを開きます。値が文字列の場合、URL のパス名として使用されます。もしあなたの好きなブラウザーでアプリを開きたい場合、環境変数 `process.env.BROWSER`(例: `firefox`)を定義できます。詳細は [`open` パッケージ](https://github.com/sindresorhus/open#app) をご覧ください。また、`process.env.BROWSER_ARGS` を設定して、追加の引数を渡すこともできます(例: `--incognito`)。 + +また、`BROWSER` と `BROWSER_ARGS` は `.env` ファイルで設定できる特別な環境変数です。詳しくは [`open` パッケージ](https://github.com/sindresorhus/open#app) を参照してください。 **例:** @@ -77,11 +118,11 @@ export default defineConfig({ - **型:** `Record` -開発サーバのカスタムプロキシのルールを設定します。`{ key: options }` のペアのオブジェクトが必要です。リクエストパスがそのキーで始まるすべてのリクエストは、その指定されたターゲットにプロキシされます。キーが `^` で始まる場合は `RegExp` として解釈されます。プロキシのインスタンスにアクセスするには `configure` オプションを使用します。 +開発サーバーのカスタムプロキシのルールを設定します。`{ key: options }` のペアのオブジェクトが必要です。リクエストパスがそのキーで始まるすべてのリクエストは、その指定されたターゲットにプロキシされます。キーが `^` で始まる場合は `RegExp` として解釈されます。プロキシのインスタンスにアクセスするには `configure` オプションを使用します。リクエストが設定したプロキシのルールのいずれかに一致した場合、そのリクエストは Vite によって変換されません。 相対的でない [`base`](/config/shared-options.md#base) を使用する場合、各キーの先頭に `base` を付けなければならないことに注意してください。 -[`http-proxy`](https://github.com/http-party/node-http-proxy) を使用します。全オプションは[こちら](https://github.com/http-party/node-http-proxy#options)。 +[`http-proxy-3`](https://github.com/sagemathinc/http-proxy-3#options) を拡張します。他のオプションは[こちら](https://github.com/vitejs/vite/blob/main/packages/vite/src/node/server/middlewares/proxy.ts#L13)。 場合によっては、基盤となる開発サーバーを設定したいこともあるでしょう(例: 内部の [connect](https://github.com/senchalabs/connect) アプリにカスタムミドルウェアを追加する場合など)。そのためには、独自の [plugin](/guide/using-plugins.html) を書き、[configureServer](/guide/api-plugin.html#configureserver) 関数を使用する必要があります。 @@ -91,15 +132,21 @@ export default defineConfig({ export default defineConfig({ server: { proxy: { - // 文字列のショートハンド: http://localhost:5173/foo -> http://localhost:4567/foo + // 文字列のショートハンド: + // http://localhost:5173/foo + // -> http://localhost:4567/foo '/foo': 'http://localhost:4567', - // オプションを使用: http://localhost:5173/api/bar-> http://jsonplaceholder.typicode.com/bar + // オプションを使用: + // http://localhost:5173/api/bar + // -> http://jsonplaceholder.typicode.com/bar '/api': { target: 'http://jsonplaceholder.typicode.com', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, ''), }, - // 正規表現を使用: http://localhost:5173/fallback/ -> http://jsonplaceholder.typicode.com/ + // 正規表現を使用: + // http://localhost:5173/fallback/ + // -> http://jsonplaceholder.typicode.com/ '^/fallback/.*': { target: 'http://jsonplaceholder.typicode.com', changeOrigin: true, @@ -113,10 +160,15 @@ export default defineConfig({ // プロキシは 'http-proxy' のインスタンスになります }, }, - // Web ソケット か socket.io をプロキシ化: ws://localhost:5173/socket.io -> ws://localhost:5174/socket.io + // Web ソケット か socket.io をプロキシ化: + // ws://localhost:5173/socket.io + // -> ws://localhost:5174/socket.io + // `rewriteWsOrigin` を使用すると、プロキシが CSRF 攻撃に無防備になる + // 可能性があるため、使用には注意してください。 '/socket.io': { target: 'ws://localhost:5174', ws: true, + rewriteWsOrigin: true, }, }, }, @@ -126,38 +178,47 @@ export default defineConfig({ ## server.cors - **型:** `boolean | CorsOptions` +- **デフォルト:** `{ origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/ }`(localhost, `127.0.0.1`, `::1` を許可) + +開発サーバーの CORS を設定します。[オプションオブジェクト](https://github.com/expressjs/cors#configuration-options)を渡して微調整するか、`true` で任意のオリジンを許可します。 -開発サーバの CORS を設定します。これはデフォルトで有効になっており、どんなオリジンも許可します。[オプションオブジェクト](https://github.com/expressjs/cors)を渡して微調整するか、`false` で無効にします。 +:::danger + +`server.cors` を `true` に設定すると、任意のウェブサイトから開発サーバーにリクエストを送信し、ソースコードやコンテンツをダウンロードできるようになります。許可するオリジンを明示的に常に指定することを推奨します。 + +::: ## server.headers - **型:** `OutgoingHttpHeaders` -サーバのレスポンスヘッダを指定します。 +サーバーのレスポンスヘッダーを指定します。 ## server.hmr - **型:** `boolean | { protocol?: string, host?: string, port?: number, path?: string, timeout?: number, overlay?: boolean, clientPort?: number, server?: Server }` -HMR 接続の無効化または設定(HMR WebSocket が http サーバと異なるアドレスを使用する必要がある場合)。 +HMR 接続の無効化または設定(HMR WebSocket が http サーバーと異なるアドレスを使用する必要がある場合)。 + +`server.hmr.overlay` を `false` に設定すると、サーバーエラーのオーバレイが無効になります。 -`server.hmr.overlay` を `false` に設定すると、サーバエラーのオーバレイが無効になります。 +`protocol` は、HMR 接続のために使われる WebSocket プロトコルを設定します: `ws`(WebSocket)または `wss`(WebSocket Secure) `clientPort` は、クライアント側のポートのみを上書きする高度なオプションで、クライアントコードが探すポートとは異なるポートで WebSocket を配信できます。 -`server.hmr.server` を指定されている場合、Vite は指定されたサーバを通して HMR 接続要求を処理します。ミドルウェアモードでない場合、Vite は既存のサーバを通して HMR 接続要求を処理しようとします。これは、自己署名証明書を使用する場合や、Vite を単一ポートでネットワーク上に公開したい場合に役立ちます。 +`server.hmr.server` を指定されている場合、Vite は指定されたサーバーを通して HMR 接続要求を処理します。ミドルウェアモードでない場合、Vite は既存のサーバーを通して HMR 接続要求を処理しようとします。これは、自己署名証明書を使用する場合や、Vite を単一ポートでネットワーク上に公開したい場合に役立ちます。 いくつかの例については、[`vite-setup-catalogue`](https://github.com/sapphi-red/vite-setup-catalogue)をご覧ください。 -::: tip 注 +::: tip 注意 デフォルトの設定では、Vite の前のリバースプロキシが WebSocket のプロキシに対応していることが期待されています。Vite の HMR クライアントが WebSocket の接続に失敗した場合、クライアントはリバースプロキシを迂回して直接 Vite の HMR サーバーに接続するようにフォールバックします: ``` -Direct websocket connection fallback. Check out https://vitejs.dev/config/server-options.html#server-hmr to remove the previous connection error. +Direct websocket connection fallback. Check out https://vite.dev/config/server-options.html#server-hmr to remove the previous connection error. ``` -フォールバックが発生した際のブラウザに表示されるエラーは無視できます。直接リバースプロキシを迂回してエラーを回避するには、次のいずれかを行えます: +フォールバックが発生した際のブラウザーに表示されるエラーは無視できます。直接リバースプロキシを迂回してエラーを回避するには、次のいずれかを行えます: - WebSocket もプロキシするようにリバースプロキシを設定する - [`server.strictPort = true`](#server-strictport) を設定し、`server.hmr.clientPort` を `server.port` と同じ値に設定する @@ -165,29 +226,44 @@ Direct websocket connection fallback. Check out https://vitejs.dev/config/server ::: -## server.watch +## server.warmup -- **型:** `object` +- **型:** `{ clientFiles?: string[], ssrFiles?: string[] }` +- **関連:** [よく使うファイルのウォームアップ](/guide/performance.html#warm-up-frequently-used-files) -[chokidar](https://github.com/paulmillr/chokidar#api) に渡すファイルシステムウォッチャのオプションです。 +変換するファイルをウォームアップし、結果を事前にキャッシュします。これにより、サーバー起動時の初期ページ読み込みが改善され、変換ウォーターフォールを防げます。 -Vite サーバのウォッチャは、デフォルトでは `.git/` と `node_modules/` ディレクトリをスキップします。もし `node_modules/` 内のパッケージを監視したい場合は、`server.watch.regard` に否定の glob パターンを渡すことができます。つまり: +`clientFiles` はクライアントのみで使用されるファイルであり、`ssrFiles` は SSR のみで使用されるファイルです。これらは `root` を基準としたファイルパスや [`tinyglobby`](https://github.com/SuperchupuDev/tinyglobby) パターンの配列を受け入れます。 + +起動時に Vite 開発サーバーに負荷がかからないように、頻繁に使用するファイルのみを追加するようにしてください。 ```js export default defineConfig({ server: { - watch: { - ignored: ['!**/node_modules/your-package-name/**'], + warmup: { + clientFiles: ['./src/components/*.vue', './src/utils/big-utils.js'], + ssrFiles: ['./src/server/modules/*.js'], }, }, - // 監視するパッケージは、最適化から除外する必要があります。 - // これにより、依存関係グラフに現れ、ホットリロードをトリガーできるようになります。 - optimizeDeps: { - exclude: ['your-package-name'], - }, }) ``` +## server.watch + +- **型:** `object| null` + +[chokidar](https://github.com/paulmillr/chokidar/tree/3.6.0#api) に渡すファイルシステムウォッチャーのオプションです。 + +Vite サーバーのウォッチャーはデフォルトで `root` を監視し、`.git/`、`node_modules/`、test-results/`、および Vite の `cacheDir` と `build.outDir` ディレクトリーをスキップします。監視されているファイルを更新すると Vite は HMR を適用し、必要な場合にのみページを更新します。 + +`null` に設定すると、ファイルは監視されません。[`server.watcher`](/guide/api-javascript.html#vitedevserver) は互換性のあるイベントエミッターを提供しますが、`add` または `unwatch` を呼び出しても効果はありません。 + +::: warning `node_modules` 内のファイルの監視 + +現在、`node_modules` 内のファイルやパッケージを監視することはできません。 さらなる進捗状況と回避策については、[issue #8619](https://github.com/vitejs/vite/issues/8619) を参照してください。 + +::: + ::: warning Windows Subsystem for Linux (WSL) 2 上での Vite の実行 Vite を WSL2 で実行している際、ファイルシステム監視はファイルが Windows アプリケーション(WSL2 でないプロセス)により編集された場合に動作しません。これは [WSL2 の制約](https://github.com/microsoft/WSL/issues/4739) によるものです。これは WSL2 バックエンドの Docker で実行している場合でも該当します。 @@ -195,9 +271,9 @@ Vite を WSL2 で実行している際、ファイルシステム監視はファ これを修正するためには、次のいずれかを行えます: - **推奨**: ファイルを編集するのに WSL2 アプリケーションを使用します。 - - プロジェクトフォルダを Windows ファイルシステムの外へ移動させることも推奨されます。WSL2 から Windows ファイルシステムへアクセスするのは遅いです。このオーバーヘッドを取り除くことでパフォーマンスが向上します。 + - プロジェクトフォルダーを Windows ファイルシステムの外へ移動させることも推奨されます。WSL2 から Windows ファイルシステムへアクセスするのは遅いです。このオーバーヘッドを取り除くことでパフォーマンスが向上します。 - `{ usePolling: true }` を設定する。 - - [`usePolling` は CPU 使用率が高くなること](https://github.com/paulmillr/chokidar#performance)に注意してください。 + - [`usePolling` は CPU 使用率が高くなること](https://github.com/paulmillr/chokidar/tree/3.6.0#performance)に注意してください。 ::: @@ -206,44 +282,39 @@ Vite を WSL2 で実行している際、ファイルシステム監視はファ - **型:** `boolean` - **デフォルト:** `false` -ミドルウェアモードで Vite サーバを作成します。 +ミドルウェアモードで Vite サーバーを作成します。 -- **関連:** [appType](./shared-options#apptype), [SSR - 開発サーバのセットアップ](/guide/ssr#開発サーバのセットアップ) +- **関連:** [appType](./shared-options#apptype), [SSR - 開発サーバーのセットアップ](/guide/ssr#setting-up-the-dev-server) - **例:** -```js +```js twoslash import express from 'express' import { createServer as createViteServer } from 'vite' async function createServer() { const app = express() - // ミドルウェアモードで Vite サーバを作成 + // ミドルウェアモードで Vite サーバーを作成 const vite = await createViteServer({ server: { middlewareMode: true }, - appType: 'custom', // ViteのデフォルトのHTMLを処理するミドルウェアを含めない + // Vite のデフォルトの HTML を処理するミドルウェアを含めない + appType: 'custom', }) // vite の接続インスタンスをミドルウェアとして使用 app.use(vite.middlewares) app.use('*', async (req, res) => { // `appType` が `'custom'` なので、ここでレスポンスを返すべきです。 - // 注: `appType` が `'spa'` または `'mpa'` の際は、Vite に HTML リクエスト と 404 になる - // リクエストを処理するミドルウェアが含まれます。したがって、ユーザーのミドルウェアが - // 動作するためにはViteのミドルウェアよりも前に追加されるべきです。 + // 注: `appType` が `'spa'` または `'mpa'` の際は、Vite に HTML リクエスト と + // 404 を処理するミドルウェアが含まれるため、ユーザーのミドルウェアが + // 動作するためには Vite のミドルウェアよりも前に追加されるべきです。 }) } createServer() ``` -## server.base - -- **型:** `string | undefined` - -Vite をサブフォルダとしてプロキシする場合に使用するため、http リクエストの前にこのフォルダを追加します。先頭は `/` の文字にする必要があります。 - ## server.fs.strict - **型:** `boolean` @@ -255,16 +326,18 @@ Vite をサブフォルダとしてプロキシする場合に使用するため - **型:** `string[]` -`/@fs/` 経由で配信可能なファイルを制限します。`server.fs.strict` が `true` に設定されている場合、このディレクトリリストの外にある、許可されたファイルからインポートされていないファイルにアクセスすると、403 が返されます。 +`/@fs/` 経由で配信可能なファイルを制限します。`server.fs.strict` が `true` に設定されている場合、このディレクトリーリストの外にある、許可されたファイルからインポートされていないファイルにアクセスすると、403 が返されます。 + +ディレクトリーとファイルの両方を指定することができます。 -Vite は、潜在的なワークスペースのルートを検索し、それをデフォルトとして使用します。有効なワークスペースは以下の条件を満たすもので、そうでない場合は[プロジェクトのルート](/guide/#index-html-とプロジェクトルート)にフォールバックします。 +Vite は、潜在的なワークスペースのルートを検索し、それをデフォルトとして使用します。有効なワークスペースは以下の条件を満たすもので、そうでない場合は[プロジェクトのルート](/guide/#index-html-and-project-root)にフォールバックします。 - `package.json` に `workspaces` フィールドが含まれている - 以下のファイルのいずれかを含んでいる - `lerna.json` - `pnpm-workspace.yaml` -カスタムワークスペースのルートを指定するパスを受け取ります。絶対パスか、[プロジェクトのルート](/guide/#index-html-とプロジェクトルート)からの相対パスを指定します。例えば: +カスタムワークスペースのルートを指定するパスを受け取ります。絶対パスか、[プロジェクトのルート](/guide/#index-html-and-project-root)からの相対パスを指定します。例えば: ```js export default defineConfig({ @@ -289,7 +362,8 @@ export default defineConfig({ // ワークスペースルートの検索 searchForWorkspaceRoot(process.cwd()), // あなたのカスタムルール - '/path/to/custom/allow', + '/path/to/custom/allow_directory', + '/path/to/custom/allow_file.demo', ], }, }, @@ -299,9 +373,15 @@ export default defineConfig({ ## server.fs.deny - **型:** `string[]` -- **Default:** `['.env', '.env.*', '*.{pem,crt}']` +- **デフォルト:** `['.env', '.env.*', '*.{crt,pem}', '**/.git/**']` -Vite 開発サーバでの配信が制限されている機密ファイルのブロックリスト。これは [`server.fs.allow`](#server-fs-allow) よりも優先度が高くなります。[picomatch パターン](https://github.com/micromatch/picomatch#globbing-features)がサポートされています。 +Vite 開発サーバーでの配信が制限されている機密ファイルのブロックリスト。これは [`server.fs.allow`](#server-fs-allow) よりも優先度が高くなります。[picomatch パターン](https://github.com/micromatch/picomatch#globbing-features)がサポートされています。 + +::: tip 注意 + +このブロックリストは[public ディレクトリー](/guide/assets.md#the-public-directory)には適用されません。public ディレクトリー内のすべてのファイルは、ビルド中に出力ディレクトリーに直接コピーされるため、フィルタリングされずに提供されます。 + +::: ## server.origin @@ -316,3 +396,30 @@ export default defineConfig({ }, }) ``` + +## server.sourcemapIgnoreList + +- **型:** `false | (sourcePath: string, sourcemapPath: string) => boolean` +- **デフォルト:** `(sourcePath) => sourcePath.includes('node_modules')` + +サーバーのソースマップにあるソースファイルを無視するかどうか。[`x_google_ignoreList` ソースマップ拡張](https://developer.chrome.com/articles/x-google-ignore-list/)を設定するため使用されます。 + +`server.sourcemapIgnoreList` は、開発サーバーの [`build.rollupOptions.output.sourcemapIgnoreList`](https://rollupjs.org/configuration-options/#output-sourcemapignorelist) に相当します。2 つの設定オプションの違いは、rollup の関数が `sourcePath` の相対パスで呼び出されるのに対して、`server.sourcemapIgnoreList` は絶対パスで呼び出されることです。開発中、ほとんどのモジュールはマップとソースが同じフォルダーにあるため、`sourcePath` の相対パスはファイル名そのものになります。このような場合、代わりに絶対パスを使用するのが便利です。 + +デフォルトでは `node_modules` を含むすべてのパスを除外します。この動作を無効にするには `false` を渡します。もしくは、完全に制御するには、ソースパスとソースマップパスを受け取り、ソースパスを無視するかどうかを返す関数を指定します。 + +```js +export default defineConfig({ + server: { + // これはデフォルトの値であり、パスに node_modules を含むすべての + // ファイルを無視リストに追加します。 + sourcemapIgnoreList(sourcePath, sourcemapPath) { + return sourcePath.includes('node_modules') + }, + }, +}) +``` + +::: tip +[`server.sourcemapIgnoreList`](#server-sourcemapignorelist) と [`build.rollupOptions.output.sourcemapIgnoreList`](https://rollupjs.org/configuration-options/#output-sourcemapignorelist) は個別に設定する必要があります。`server.sourcemapIgnoreList` はサーバーのみの設定であり、定義された rollup オプションからデフォルト値を取得しません。 +::: diff --git a/config/shared-options.md b/config/shared-options.md index ffbb811f..964cba26 100644 --- a/config/shared-options.md +++ b/config/shared-options.md @@ -1,23 +1,26 @@ # 共通オプション +特に記載がない限り、このセクションのオプションは開発、ビルド、プレビューのすべてに適用されます。 + ## root - **型:** `string` - **デフォルト:** `process.cwd()` -プロジェクトのルートディレクトリ(`index.html` が置かれている場所)。絶対パス、または現在のワーキングディレクトリからの相対パスを指定できます。 +プロジェクトのルートディレクトリー(`index.html` が置かれている場所)。絶対パス、または現在のワーキングディレクトリーからの相対パスを指定できます。 -詳細は [プロジェクトルート](/guide/#index-html-とプロジェクトルート) を参照してください。 +詳細は [プロジェクトルート](/guide/#index-html-and-project-root) を参照してください。 ## base - **型:** `string` - **デフォルト:** `/` +- **関連:** [`server.origin`](/config/server-options.md#server-origin) 開発環境または本番環境で配信される際のベースとなるパブリックパス。有効な値は次のとおりです: - 絶対 URL パス名。例 `/foo/` -- 完全な URL。例 `https://foo.com/` +- 完全な URL。例 `https://bar.com/foo/`(オリジン部分は開発環境では使用されないため、値は `/foo/` と同じです) - 空文字列または `./`(埋め込みデプロイ用) 詳細は [Public Base Path](/guide/build#public-base-path) を参照してください。 @@ -33,24 +36,25 @@ config でこれを指定すると、**serve と build 両方**のデフォル ## define -- **型:** `Record` - -グローバル定数の置換を定義します。エントリは開発時にグローバルで定義され、ビルド時に静的に置き換えられます。 +- **型:** `Record` -- `2.0.0-beta.70` 以降、文字列の値は純粋な式として評価されるので、文字列の定数を定義する場合は、明示的に引用符で囲う必要があります(例 `JSON.stringify` を使う)。 +グローバル定数の置換を定義します。エントリーは開発時にグローバルで定義され、ビルド時に静的に置き換えられます。 -- [esbuild の動作](https://esbuild.github.io/api/#define)と矛盾しないように、式は JSON オブジェクト(null, boolean, number, string, array, object)か単一の識別子でなければなりません。 +Vite は [esbuild の define](https://esbuild.github.io/api/#define) を使って置換を行うので、値の式は JSON でシリアライズ可能な値(null、boolean、数値、文字列、配列、オブジェクト)または単一の識別子を含む文字列でなければなりません。文字列以外の値の場合、Vite は自動的に `JSON.stringify` で文字列に変換します。 -- マッチした部分が他の文字、数字、`_` または `$` で囲まれていない場合のみ置換されます。 - -::: warning -構文解析なしの単純なテキスト置換として実装されているため、`define` は「定数」にのみ使用することをおすすめします。 +**例:** -例えば、`process.env.FOO` や `__APP_VERSION__` などが適しています。しかし、`process` や `global` はこのオプションに入れるべきではありません。変数は代わりに Shim や Polyfill で使用できます。 -::: +```js +export default defineConfig({ + define: { + __APP_VERSION__: JSON.stringify('v1.0.0'), + __API_URL__: 'window.__backend_api_url', + }, +}) +``` ::: tip 注意 -TypeScript を使用する場合、型チェックと自動補完を利用するには `env.d.ts` または `vite-env.d.ts` ファイルに型定義を追加してください。 +TypeScript を使用する場合、型チェックと自動補完を利用するには `vite-env.d.ts` ファイルに型定義を追加してください。 例: @@ -61,20 +65,6 @@ declare const __APP_VERSION__: string ::: -::: tip 注意 -開発環境とビルド環境で `define` の実装が異なるので、矛盾を回避するために、いくつかの使い方を避ける必要があります。 - -例: - -```js -const obj = { - __NAME__, // オブジェクトのショートハンドプロパティ名を定義しないこと - __KEY__: value, // オブジェクトのキーを定義しないこと -} -``` - -::: - ## plugins - **型:** `(Plugin | Plugin[] | Promise)[]` @@ -86,32 +76,32 @@ const obj = { - **型:** `string | false` - **デフォルト:** `"public"` -加工せずに静的アセットとして配信するディレクトリ。このディレクトリのファイルは、開発時には `/` として配信され、ビルド時には `outDir` のルートにコピーされます。常に変換されることなくそのまま配信またはコピーされます。この値にはファイルシステムの絶対パスかプロジェクトルートからの相対パスを指定できます。 +加工せずに静的アセットとして配信するディレクトリー。このディレクトリーのファイルは、開発時には `/` として配信され、ビルド時には `outDir` のルートにコピーされます。常に変換されることなくそのまま配信またはコピーされます。この値にはファイルシステムの絶対パスかプロジェクトルートからの相対パスを指定できます。 `publicDir` を `false` に設定すると、この機能は無効になります。 -詳細は [`public` ディレクトリ](/guide/assets#public-ディレクトリ) を参照してください。 +詳細は [`public` ディレクトリー](/guide/assets#the-public-directory) を参照してください。 ## cacheDir - **型:** `string` - **デフォルト:** `"node_modules/.vite"` -キャッシュファイルを保存するディレクトリ。このディレクトリのファイルは、事前バンドルされた依存関係や Vite によって生成されたキャッシュファイルで、パフォーマンスを向上させることができます。`--force` フラグを使用したり、手動でディレクトリを削除するとキャッシュファイルを再生成できます。この値にはファイルシステムの絶対パスかプロジェクトルートからの相対パスを指定できます。package.json が検出されなかった場合のデフォルトは `.vite` です。 +キャッシュファイルを保存するディレクトリー。このディレクトリーのファイルは、事前バンドルされた依存関係や Vite によって生成されたキャッシュファイルで、パフォーマンスを向上させることができます。`--force` フラグを使用したり、手動でディレクトリーを削除するとキャッシュファイルを再生成できます。この値にはファイルシステムの絶対パスかプロジェクトルートからの相対パスを指定できます。package.json が検出されなかった場合のデフォルトは `.vite` です。 ## resolve.alias - **型:** `Record | Array<{ find: string | RegExp, replacement: string, customResolver?: ResolverFunction | ResolverObject }>` -[エントリオプション](https://github.com/rollup/plugins/tree/master/packages/alias#entries)として `@rollup/plugin-alias` に渡されます。`{ find, replacement, customResolver }` の配列か、オブジェクトを指定します。 +[エントリーオプション](https://github.com/rollup/plugins/tree/master/packages/alias#entries)として `@rollup/plugin-alias` に渡されます。`{ find, replacement, customResolver }` の配列か、オブジェクトを指定します。 ファイルシステムのパスにエイリアスを設定する場合は、必ず絶対パスを使用してください。相対的なエイリアス値はそのまま使用され、ファイルシステムのパスには解決されません。 より高度なカスタム解決は[プラグイン](/guide/api-plugin)によって実現できます。 :::warning エイリアスの操作 -[SSR の外部化された依存関係](/guide/ssr#外部-ssr)のエイリアスを設定した場合は、実際の `node_modules` パッケージのエイリアスを設定することをお勧めします。[Yarn](https://classic.yarnpkg.com/en/docs/cli/add/#toc-yarn-add-alias) と [pnpm](https://pnpm.js.org/en/aliases) の両方で `npm:` のエイリアスをサポートします。 +[SSR の外部化された依存関係](/guide/ssr#ssr-externals)のエイリアスを設定した場合は、実際の `node_modules` パッケージのエイリアスを設定することをお勧めします。[Yarn](https://classic.yarnpkg.com/en/docs/cli/add/#toc-yarn-add-alias) と [pnpm](https://pnpm.io/aliases/) の両方で `npm:` のエイリアスをサポートします。 ::: ## resolve.dedupe @@ -124,9 +114,10 @@ const obj = { SSR ビルドの場合、`build.rollupOptions.output` で設定された ESM ビルド出力に対して重複排除が機能しません。これを回避するには、ESM のモジュール読み込みのためのプラグインのサポートが改善されるまで、CJS ビルド出力を使用する必要があります。 ::: -## resolve.conditions +## resolve.conditions - **型:** `string[]` +- **デフォルト:** `['module', 'browser', 'development|production']` (`defaultClientConditions`) パッケージからの[条件付きエクスポート](https://nodejs.org/api/packages.html#packages_conditional_exports)解決する際に許可される追加の条件。 @@ -145,33 +136,21 @@ SSR ビルドの場合、`build.rollupOptions.output` で設定された ESM ビ ここで、`import` と `require` は「条件」です。条件はネストさせることができ、最も具体的なものから最も具体的でないものまで指定する必要があります。 -Vite には「許可された条件」のリストがあり、許可されたリストにある最初の条件と一致します。 デフォルトで許可される条件は、`import`、`module`、`browser`、`default` と、現在のモードに基づく `production/development` です。`resolve.conditions` 設定オプションを使用すると、追加の許可条件を指定できます。 +`development|production` は、`process.env.NODE_ENV` の値に応じて `production` または `development` に置換される特殊な値です。`process.env.NODE_ENV === 'production'` の場合には `production` に置換され、それ以外の場合は `development` に置換されます。 -:::warning サブパスのエクスポートの解決 -エクスポートのキーが "/" で終わるのは Node では非推奨で、うまく動作しない可能性があります。代わりに [`*` サブパスパターン](https://nodejs.org/api/packages.html#package-entry-points) を使用するよう、パッケージ作者に連絡してください。 -::: +要件が満たされている場合は、`import`、`require`、`default` の条件が常に適用されることに注意してください。 -## resolve.mainFields +## resolve.mainFields - **型:** `string[]` -- **デフォルト:** `['module', 'jsnext:main', 'jsnext']` +- **デフォルト:** `['browser', 'module', 'jsnext:main', 'jsnext']` (`defaultClientMainFields`) -パッケージのエントリポイントを解決するときに試行する `package.json` のフィールドのリスト。これは `exports` フィールドから解決された条件付きエクスポートよりも優先順位が低いことに注意してください: エントリポイントが `exports` からの解決に成功した場合、main フィールドは無視されます。 - -## resolve.browserField - -- **型:** `boolean` -- **デフォルト:** `true` -- **非推奨** - -`browser` フィールドへの解決を有効にするかどうか。 - -将来的に `resolve.mainFields` のデフォルト値は `['browser', 'module', 'jsnext:main', 'jsnext']` となり、このオプションは削除される予定です。 +パッケージのエントリーポイントを解決するときに試行する `package.json` のフィールドのリスト。これは `exports` フィールドから解決された条件付きエクスポートよりも優先順位が低いことに注意してください: エントリーポイントが `exports` からの解決に成功した場合、main フィールドは無視されます。 ## resolve.extensions - **型:** `string[]` -- **デフォルト:** `['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json']` +- **デフォルト:** `['.mjs', '.js', '.mts', '.ts', '.jsx', '.tsx', '.json']` 拡張子を省略したインポートに試行するファイル拡張子のリスト。カスタムインポートタイプ(`.vue` など)の拡張子を省略すると、IDE や型のサポートに支障をきたす可能性があるため、推奨され**ません**。 @@ -185,40 +164,59 @@ Vite には「許可された条件」のリストがあり、許可されたリ - **関連:** [esbuild#preserve-symlinks](https://esbuild.github.io/api/#preserve-symlinks), [webpack#resolve.symlinks ](https://webpack.js.org/configuration/resolve/#resolvesymlinks) +## html.cspNonce + +- **型:** `string` +- **関連:** [コンテンツセキュリティポリシー(CSP)](/guide/features#content-security-policy-csp) + +script や style タグを生成するときに使われる nonce 値のプレースホルダー。この値を設定すると、nonce 値を持つ meta タグも生成されます。 + ## css.modules - **型:** -```ts -interface CSSModulesOptions { - scopeBehaviour?: 'global' | 'local' - globalModulePaths?: RegExp[] - generateScopedName?: - | string - | ((name: string, filename: string, css: string) => string) - hashPrefix?: string - /** - * デフォルト: null - */ - localsConvention?: - | 'camelCase' - | 'camelCaseOnly' - | 'dashes' - | 'dashesOnly' - | null -} -``` + ```ts + interface CSSModulesOptions { + getJSON?: ( + cssFileName: string, + json: Record, + outputFileName: string, + ) => void + scopeBehaviour?: 'global' | 'local' + globalModulePaths?: RegExp[] + exportGlobals?: boolean + generateScopedName?: + | string + | ((name: string, filename: string, css: string) => string) + hashPrefix?: string + /** + * デフォルト: undefined + */ + localsConvention?: + | 'camelCase' + | 'camelCaseOnly' + | 'dashes' + | 'dashesOnly' + | (( + originalClassName: string, + generatedClassName: string, + inputFile: string, + ) => string) + } + ``` CSS モジュールの動作を設定します。オプションは [postcss-modules](https://github.com/css-modules/postcss-modules) に渡されます。 +このオプションは [Lightning CSS](../guide/features.md#lightning-css) 使用時には効果がありません。有効にする場合は [`css.lightningcss.cssModules`](https://lightningcss.dev/css-modules.html) を使用してください。 + ## css.postcss - **型:** `string | (postcss.ProcessOptions & { plugins?: postcss.AcceptedPlugin[] })` -インラインの PostCSS 設定、もしくは PostCSS の設定ファイルを検索するカスタムディレクトリ(デフォルトはプロジェクトルート)。 +インラインの PostCSS 設定、もしくは PostCSS の設定ファイルを検索するカスタムディレクトリー(デフォルトはプロジェクトルート)。 インラインの PostCSS の設定には、`postcss.config.js` と同じ書式を想定してします。しかし、`plugins` のプロパティには、[配列のフォーマット](https://github.com/postcss/postcss-load-config/blob/main/README.md#array)しか使用できません。 -検索は [postcss-load-config](https://github.com/postcss/postcss-load-config) を使用し、対応する設定ファイル名のみが読み込まれます。 +検索は [postcss-load-config](https://github.com/postcss/postcss-load-config) を使用し、対応する設定ファイル名のみが読み込まれます。ワークスペースルート(またはワークスペースが見つからない場合は [プロジェクトルート](/guide/#index-html-and-project-root))以外の設定ファイルは、デフォルトでは検索されません。必要に応じて、特定の設定ファイルを読み込むために、ルート外のカスタムパスを指定できます。 インライン設定が提供された場合、Vite は他の PostCSS 設定ソースを検索しないことに注意してください。 @@ -226,31 +224,119 @@ CSS モジュールの動作を設定します。オプションは [postcss-mod - **型:** `Record` -CSS プリプロセッサに渡すオプションを指定します。オプションのキーとしてファイルの拡張子を使用します。例: +CSS プリプロセッサーに渡すオプションを指定します。オプションのキーとしてファイルの拡張子を使用します。各プリプロセッサーでサポートされているオプションは、それぞれのドキュメントで確認できます: + +- `sass`/`scss`: + - `sass-embedded` がインストールされている場合はそれを使用し、そうでない場合は `sass` を使用します。最高のパフォーマンスを得るには、`sass-embedded` パッケージをインストールすることをお勧めします。 + - [オプション](https://sass-lang.com/documentation/js-api/interfaces/stringoptions/) +- `less`: [オプション](https://lesscss.org/usage/#less-options)。 +- `styl`/`stylus`: オブジェクトとして渡せる [`define`](https://stylus-lang.com/docs/js.html#define-name-node) のみサポートされています。 + +**例:** ```js export default defineConfig({ css: { preprocessorOptions: { - scss: { - additionalData: `$injectedColor: orange;`, + less: { + math: 'parens-division', }, styl: { - additionalData: `$injectedColor ?= orange`, + define: { + $specialColor: new stylus.nodes.RGBA(51, 197, 255, 1), + }, + }, + scss: { + importers: [ + // ... + ], }, }, }, }) ``` +### css.preprocessorOptions[extension].additionalData + +- **型:** `string | ((source: string, filename: string) => (string | { content: string; map?: SourceMap }))` + +このオプションは、各スタイルコンテンツに追加のコードを挿入するために使用できます。変数だけではなく実際のスタイルを含めた場合、それらのスタイルは最終的なバンドルに複製されることに注意してください。 + +**例:** + +```js +export default defineConfig({ + css: { + preprocessorOptions: { + scss: { + additionalData: `$injectedColor: orange;`, + }, + }, + }, +}) +``` + +## css.preprocessorMaxWorkers + +- **型:** `number | true` +- **デフォルト:** `true` + +CSS プリプロセッサーが使用できるスレッドの最大数を指定します。`true` は CPU の数 -1 を意味します。`0` に指定すると、Vite ワーカーを作成せず、メインスレッドでプリプロセッサーを実行します。 + +プリプロセッサのオプションによっては、このオプションを `0` に設定しなかったとしても、Vite はプリプロセッサをメインスレッドで実行する場合があります。 + ## css.devSourcemap -- **実験的機能** +- **実験的機能:** [フィードバックをしてください](https://github.com/vitejs/vite/discussions/13845) - **型:** `boolean` - **デフォルト:** `false` 開発時にソースマップを有効にするかどうか。 +## css.transformer + +- **実験的機能:** [フィードバックをしてください](https://github.com/vitejs/vite/discussions/13835) +- **型:** `'postcss' | 'lightningcss'` +- **デフォルト:** `'postcss'` + +CSS 処理に使用するエンジンを選択します。詳細は [Lightning CSS](../guide/features.md#lightning-css) を参照してください。 + +::: info `@import` の重複 +postcss (postcss-import) は、ブラウザーからの `@import` が重複した場合の動作が異なることに注意してください。[postcss/postcss-import#462](https://github.com/postcss/postcss-import/issues/462) を参照してください。 +::: + +## css.lightningcss + +- **実験的機能:** [フィードバックをしてください](https://github.com/vitejs/vite/discussions/13835) +- **型:** + +```js +import type { + CSSModulesConfig, + Drafts, + Features, + NonStandard, + PseudoClasses, + Targets, +} from 'lightningcss' +``` + +```js +{ + targets?: Targets + include?: Features + exclude?: Features + drafts?: Drafts + nonStandard?: NonStandard + pseudoClasses?: PseudoClasses + unusedSymbols?: string[] + cssModules?: CSSModulesConfig, + // ... +} +``` + +Lightning CSS の設定。すべての変換オプションは [Lightning CSS のリポジトリー](https://github.com/parcel-bundler/lightningcss/blob/master/node/index.d.ts)で確認できます。 + ## json.namedExports - **型:** `boolean` @@ -260,18 +346,18 @@ export default defineConfig({ ## json.stringify -- **型:** `boolean` -- **デフォルト:** `false` +- **型:** `boolean | 'auto'` +- **デフォルト:** `'auto'` `true` に設定すると、インポートされた JSON は `export default JSON.parse("...")` に変換されます。これは特に JSON ファイルが大きい場合、オブジェクトリテラルよりも大幅にパフォーマンスが向上します。 -有効にすると、名前付きインポートは無効になります。 +`'auto'` に設定すると、[データが 10kB より大きい](https://v8.dev/blog/cost-of-javascript-2019#json:~:text=A%20good%20rule%20of%20thumb%20is%20to%20apply%20this%20technique%20for%20objects%20of%2010%20kB%20or%20larger) 場合にのみデータが文字列化されます。 ## esbuild - **型:** `ESBuildOptions | false` -`ESBuildOptions` は [esbuild 自身の変換オプション](https://esbuild.github.io/api/#transform-api)を拡張します。最も一般的な使用例は、JSX のカスタマイズです: +`ESBuildOptions` は [esbuild 自身の変換オプション](https://esbuild.github.io/api/#transform)を拡張します。最も一般的な使用例は、JSX のカスタマイズです: ```js export default defineConfig({ @@ -284,7 +370,7 @@ export default defineConfig({ デフォルトでは esbuild は `ts`, `jsx`, `tsx` ファイルに適用されます。`esbuild.include` と `esbuild.exclude` でカスタマイズでき、正規表現か [picomatch](https://github.com/micromatch/picomatch#globbing-features) パターン、もしくはそれらの配列を指定します。 -また、`esbuild.jsxInject` を使用すると、esbuild で変換されたすべてのファイルに対して JSX ヘルパの import を自動的に注入できます: +また、`esbuild.jsxInject` を使用すると、esbuild で変換されたすべてのファイルに対して JSX ヘルパーの import を自動的に注入できます: ```js export default defineConfig({ @@ -325,6 +411,40 @@ export default defineConfig({ コンソール出力の詳細度を調整します。デフォルトは `'info'` です。 +## customLogger + +- **型:** + ```ts + interface Logger { + info(msg: string, options?: LogOptions): void + warn(msg: string, options?: LogOptions): void + warnOnce(msg: string, options?: LogOptions): void + error(msg: string, options?: LogErrorOptions): void + clearScreen(type: LogType): void + hasErrorLogged(error: Error | RollupError): boolean + hasWarned: boolean + } + ``` + +メッセージを記録するためのカスタムロガーを使用します。Vite の `createLogger` API を使って、デフォルトのロガーを取得し、例えば、メッセージを変更したり、特定の警告をフィルタリングしたりするようにカスタマイズできます。 + +```js twoslash +import { createLogger, defineConfig } from 'vite' + +const logger = createLogger() +const loggerWarn = logger.warn + +logger.warn = (msg, options) => { + // 空の CSS ファイル警告を無視する + if (msg.includes('vite:css') && msg.includes(' is empty')) return + loggerWarn(msg, options) +} + +export default defineConfig({ + customLogger: logger, +}) +``` + ## clearScreen - **型:** `boolean` @@ -334,10 +454,10 @@ Vite が特定のメッセージをログに出力する際、ターミナル画 ## envDir -- **型:** `string` +- **型:** `string | false` - **デフォルト:** `root` -`.env` ファイルを読み込むディレクトリ。絶対パス、もしくはプロジェクトルートからの相対パスを指定します。 +`.env` ファイルを読み込むディレクトリー。絶対パス、もしくはプロジェクトルートからの相対パスを指定します。`false` は `.env` ファイルの読み込みを無効化します。 環境ファイルの詳細については[こちら](/guide/env-and-mode#env-files)をご覧ください。 @@ -346,10 +466,19 @@ Vite が特定のメッセージをログに出力する際、ターミナル画 - **型:** `string | string[]` - **デフォルト:** `VITE_` -`envPrefix` で始まる環境変数は、import.meta.env でクライアントのソースコードに公開されます。 +`envPrefix` で始まる環境変数は、`import.meta.env` でクライアントのソースコードに公開されます。 :::warning SECURITY NOTES `envPrefix` に `''` を設定してはいけません。全ての env 変数を公開してしまい、予期せぬ機密情報の漏洩を引き起こします。Vite は `''` を検出するとエラーをスローします。 + +プレフィックスのない変数を公開したい場合は、[define](#define) を使って公開できます: + +```js +define: { + 'import.meta.env.ENV_VARIABLE': JSON.stringify(process.env.ENV_VARIABLE) +} +``` + ::: ## appType @@ -357,10 +486,19 @@ Vite が特定のメッセージをログに出力する際、ターミナル画 - **型:** `'spa' | 'mpa' | 'custom'` - **デフォルト:** `'spa'` -アプリケーションがシングルページアプリケーション (SPA) か、[マルチページアプリケーション (MPA)](../guide/build#マルチページアプリ)か、カスタムアプリケーション (SSR と独自に HTML を処理するフレームワーク): +アプリケーションがシングルページアプリケーション(SPA)か、[マルチページアプリケーション(MPA)](../guide/build#multi-page-app)か、カスタムアプリケーション(SSR と独自に HTML を処理するフレームワーク): - `'spa'`: HTML ミドルウェアを含め、SPA 用のフォールバックを使用する。プレビューで `single: true` を [sirv](https://github.com/lukeed/sirv) に設定する - `'mpa'`: HTML ミドルウェアを含める - `'custom'`: HTML ミドルウェアを含めない 詳細は Vite の [SSR ガイド](/guide/ssr#vite-cli) 参照してください。関連: [`server.middlewareMode`](./server-options#server-middlewaremode)。 + +## future + +- **型:** `Record` +- **関連:** [破壊的変更](/changes/) + +Vite の次期メジャーバージョンへのスムーズな移行に備え、将来的な破壊的変更を可能にします。このリストは、新機能の開発に伴い、いつでも更新、追加、削除される可能性があります。 + +設定可能なオプションの詳細については、[破壊的変更](/changes/) ページを参照してください。 diff --git a/config/ssr-options.md b/config/ssr-options.md index dc4ec629..734528a3 100644 --- a/config/ssr-options.md +++ b/config/ssr-options.md @@ -1,30 +1,62 @@ # SSR オプション +特に記載がない限り、このセクションのオプションは開発とビルドの両方に適用されます。 + ## ssr.external -- **型:** `string[]` -- **関連:** [SSR Externals](/guide/ssr#外部-ssr) +- **型:** `string[] | true` +- **関連:** [外部 SSR](/guide/ssr#ssr-externals) + +SSR 用の指定された依存関係と、その遷移的な(transitive)依存関係を外部化します。デフォルトでは、(HMR のために)リンクされた依存関係を除いて、すべての依存関係が外部化されます。リンクされた依存関係を外部化したい場合、その名前をこのオプションに渡せます。 -SSR の依存関係を強制的に外部化します。 +`true` の場合、リンクされた依存関係を含むすべての依存関係が外部化されます。 + +`ssr.noExternal` に(任意の型を使用して)リストされた場合でも、(`string[]` 型を使用して)明示的にリストされた依存関係が常に優先されることに注意してください。 ## ssr.noExternal - **型:** `string | RegExp | (string | RegExp)[] | true` -- **関連:** [SSR Externals](/guide/ssr#外部-ssr) +- **関連:** [外部 SSR](/guide/ssr#ssr-externals) + +指定した依存関係が SSR のために外部化されるのを防ぎます。もし外部化された場合、依存関係はビルドにバンドルされます。デフォルトでは、(HMR のために)リンクされた依存関係だけが外部化されません。リンクされた依存関係を外部化したい場合は、その名前を `ssr.external` オプションに渡せます。 -指定した依存関係が SSR のために外部化されるのを防ぎます。`true` の場合、どの依存関係も外部化されません。 +`true` の場合、どの依存関係も外部化されません。ただし、(`string[]` 型を使用して)`ssr.external` に明示的にリストされた依存関係は優先され、依然として外部化されます。`ssr.target: 'node'` が設定された場合、Node.js のビルトインもデフォルトで外部化されます。 + +`ssr.noExternal: true` と `ssr.external: true` の両方が設定された場合、`ssr.noExternal` が優先され、どの依存関係も外部化されないことに注意してください。 ## ssr.target - **型:** `'node' | 'webworker'` - **デフォルト:** `node` -SSR サーバのビルドターゲット。 +SSR サーバーのビルドターゲット。 + +## ssr.resolve.conditions + +- **型:** `string[]` +- **デフォルト:** `['module', 'node', 'development|production']` (`defaultServerConditions`)(`ssr.target === 'webworker'` の場合は `['module', 'browser', 'development|production']` (`defaultClientConditions`)) +- **関連:** [Resolve Conditions](./shared-options.md#resolve-conditions) + +これらの条件はプラグインパイプラインで使用され、SSR ビルド時に外部化されていない依存関係にのみ影響します。外部化されたインポートに影響を与えるには `ssr.resolve.externalConditions` を使用してください。 -## ssr.format +## ssr.resolve.externalConditions -- **実験的機能** -- **型:** `'esm' | 'cjs'` -- **デフォルト:** `esm` +- **型:** `string[]` +- **デフォルト:** `['node']` + +外部化された直接の依存関係(Vite にインポートされた外部の依存関係)の SSR インポート(`ssrLoadModule` を含む)の際に使用される条件。 + +:::tip + +このオプションを使用する場合、一貫性のある動作のために、開発時とビルド時の両方で同じ値を使用して [`--conditions` フラグ](https://nodejs.org/docs/latest/api/cli.html#-c-condition---conditionscondition) 付きで Node を実行してください。 + +たとえば、`['node', 'custom']` と設定した場合には、開発時には `NODE_OPTIONS='--conditions custom' vite`、ビルド後には `NODE_OPTIONS="--conditions custom" node ./dist/server.js` を実行する必要があります。 + +::: + +## ssr.resolve.mainFields + +- **型:** `string[]` +- **デフォルト:** `['module', 'jsnext:main', 'jsnext']` -SSR サーバのビルドフォーマット。Vite 3 以降の SSR ビルドはデフォルトで ESM を生成します。`'cjs'` を選択すると CJS が生成されますが、おすすめではありません。このオプションは、ユーザーが ESM にアップデートするまでの時間を設けるために、実験的機能のままにしています。CJS ビルドには、ESM フォーマットにはない複雑な外部化ヒューリスティックが必要です。 +パッケージのエントリーポイントを解決する際に試す `package.json` のフィールドのリスト。これは、`exports` フィールドから解決される条件付きエクスポートよりも優先順位が低くなることに注意してください。エントリーポイントが `exports` から正常に解決された場合、メインフィールドは無視されます。この設定は、外部化されていない依存関係のみに影響します。 diff --git a/config/worker-options.md b/config/worker-options.md index 01ea4b93..b008d7f1 100644 --- a/config/worker-options.md +++ b/config/worker-options.md @@ -1,22 +1,23 @@ -# ワーカのオプション +# ワーカーのオプション -Web Worker に関連するオプション。 +特に記載がない限り、このセクションのオプションは開発、ビルド、プレビューのすべてに適用されます。 ## worker.format - **型:** `'es' | 'iife'` -- **デフォルト:** `iife` +- **デフォルト:** `'iife'` -ワーカバンドルの出力形式。 +ワーカーバンドルの出力形式。 ## worker.plugins -- **型:** [`(Plugin | Plugin[])[]`](./shared-options#plugins) +- **型:** [`() => (Plugin | Plugin[])[]`](./shared-options#plugins) -ワーカバンドルに適用される Vite プラグイン。[config.plugins](./shared-options#plugins) はワーカに適用されないため、代わりにここで設定する必要があることに注意してください。 +ワーカーバンドルに適用される Vite プラグイン。[config.plugins](./shared-options#plugins) は開発時のワーカーのみに適用されるため、ビルドの場合はここで設定する必要があることに注意してください。 +この関数は、rollup ワーカーを並行してビルドする際に使用される新しいプラグインインスタンスを返す必要があります。そのため、 `config` フックの `config.worker` オプションの変更は無視されます。 ## worker.rollupOptions -- **型:** [`RollupOptions`](https://rollupjs.org/guide/en/#big-list-of-options) +- **型:** [`RollupOptions`](https://rollupjs.org/configuration-options/) -ワーカバンドルをビルドするための Rollup オプション。 +ワーカーバンドルをビルドするための Rollup オプション。 diff --git a/guide/api-environment-frameworks.md b/guide/api-environment-frameworks.md new file mode 100644 index 00000000..f4e327af --- /dev/null +++ b/guide/api-environment-frameworks.md @@ -0,0 +1,330 @@ +# フレームワーク向けの Environment API + +:::info Release Candidate +Environment API は一般的にリリース候補段階にあります。エコシステムがそれらを実験し、構築できるように、メジャーリリース間での API の安定性を維持します。ただし、[一部の特定の API](/changes/#considering) はまだ実験的であることに注意してください。 + +ダウンストリームプロジェクトが新しい機能を実験し、それらを検証する時間を持った後、将来のメジャーリリースでこれらの新しい API を安定化する予定です(破壊的変更を含む可能性あり)。 + +リソース: + +- 新しい API に関するフィードバックを収集する [Feedback discussion](https://github.com/vitejs/vite/discussions/16358) +- 新しい API が実装され、レビューされる [Environment API PR](https://github.com/vitejs/vite/pull/16471) + +ぜひフィードバックをお寄せください。 +::: + +## DevEnvironment の通信レベル {#devenvironment-communication-levels} + +環境は異なるランタイムで実行される可能性があるため、環境との通信にはランタイムに応じて制約がある場合があります。フレームワークがランタイムに依存しないコードを簡単に記述できるように、Environment API は 3 種類の通信レベルを提供します。 + +### `RunnableDevEnvironment` + +`RunnableDevEnvironment` は、任意の値を通信できる環境です。暗黙的な `ssr` 環境とその他の非クライアント環境では、開発中にデフォルトで `RunnableDevEnvironment` が使用されます。これには、Vite サーバーが実行しているのと同じランタイムが必要ですが、`ssrLoadModule` と同様に動作し、フレームワークが SSR 開発ストーリーの HMR を移行して有効にできるようにします。`isRunnableDevEnvironment` 関数を使用して、実行可能な環境をすべて保護できます。 + +```ts +export class RunnableDevEnvironment extends DevEnvironment { + public readonly runner: ModuleRunner +} + +class ModuleRunner { + /** + * 実行する URL。 + * ルートからの相対的なファイルパス、サーバーパス、ID を受け付けます。 + * インスタンス化されたモジュールを返します (ssrLoadModule と同じ) + */ + public async import(url: string): Promise> + /** + * その他の ModuleRunner メソッド... + */ +} + +if (isRunnableDevEnvironment(server.environments.ssr)) { + await server.environments.ssr.runner.import('/entry-point.js') +} +``` + +:::warning +`runner` は、初めてアクセスされたときにのみ遅延評価されます。Vite は、`process.setSourceMapsEnabled` を呼び出して `runner` が作成されたとき、またはそれが利用できない場合は `Error.prepareStackTrace` をオーバーライドすることによって、ソースマップのサポートを有効にすることに注意してください。 +::: + +[SSR セットアップガイド](/guide/ssr#setting-up-the-dev-server)で説明されているように、ミドルウェアモードに設定された Vite サーバーがあるとして、Environment API を使って SSR ミドルウェアを実装してみましょう。これは `ssr` と呼ばれる必要はないので、この例では `server` と名付けます。エラー処理は省略します。 + +```js +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import { createServer } from 'vite' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) + +const viteServer = await createServer({ + server: { middlewareMode: true }, + appType: 'custom', + environments: { + server: { + // デフォルトでは、モジュールは vite サーバーと同じプロセスで実行されます + }, + }, +}) + +// TypeScript でこれを RunnableDevEnvironment にキャストするか、ランナーへのアクセスを +// 保護するために isRunnableDevEnvironment を使用する必要があるかもしれません +const serverEnvironment = viteServer.environments.server + +app.use('*', async (req, res, next) => { + const url = req.originalUrl + + // 1. index.html を読み込む + const indexHtmlPath = path.resolve(__dirname, 'index.html') + let template = fs.readFileSync(indexHtmlPath, 'utf-8') + + // 2. Vite HTML 変換を適用します。これにより、Vite HMR クライアントが挿入され、 + // Vite プラグインからの HTML 変換も適用されます。 + // 例: global preambles from @vitejs/plugin-react + template = await viteServer.transformIndexHtml(url, template) + + // 3. サーバーエントリをロードします。import(url) は、 + // ESM ソースコードを Node.js で使用できるように自動的に変換します。 + // バンドルは不要で、完全な HMR サポートを提供します。 + const { render } = await serverEnvironment.runner.import( + '/src/entry-server.js', + ) + + // 4. アプリの HTML をレンダリングします。これは、entry-server.js のエクスポートされた + // `render` 関数が適切なフレームワーク SSR API を呼び出すことを前提としています。 + // 例: ReactDOMServer.renderToString() + const appHtml = await render(url) + + // 5. アプリでレンダリングされた HTML をテンプレートに挿入します。 + const html = template.replace(``, appHtml) + + // 6. レンダリングされた HTML を送信します。 + res.status(200).set({ 'Content-Type': 'text/html' }).end(html) +}) +``` + +HMR をサポートする環境(`RunnableDevEnvironment` など)を使用する場合は、最適な動作を得るために、サーバーエントリファイルに `import.meta.hot.accept()` を追加する必要があります。これを行わないと、サーバーファイルの変更によってサーバーモジュールグラフ全体が無効になります: + +```js +// src/entry-server.js +export function render(...) { ... } + +if (import.meta.hot) { + import.meta.hot.accept() +} +``` + +### `FetchableDevEnvironment` + +:::info + +[`FetchableDevEnvironment` プロポーザル](https://github.com/vitejs/vite/discussions/18191)に関するフィードバックを募集しています。 + +::: + +`FetchableDevEnvironment` は、[Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Window/fetch) インターフェースを介してランタイムと通信できる環境です。`RunnableDevEnvironment` は限られたランタイムでしか実装できないため、`RunnableDevEnvironment` の代わりに `FetchableDevEnvironment` を使用することをお勧めします。 + +この環境は、`handleRequest` メソッドを介してリクエストを処理する標準化された方法を提供します。 + +```ts +import { + createServer, + createFetchableDevEnvironment, + isFetchableDevEnvironment, +} from 'vite' + +const server = await createServer({ + server: { middlewareMode: true }, + appType: 'custom', + environments: { + custom: { + dev: { + createEnvironment(name, config) { + return createFetchableDevEnvironment(name, config, { + handleRequest(request: Request): Promise | Response { + // リクエストを処理し、レスポンスを返します + }, + }) + }, + }, + }, + }, +}) + +// Environment API のどの利用者からも `dispatchFetch` を呼び出せるようになりました +if (isFetchableDevEnvironment(server.environments.custom)) { + const response: Response = await server.environments.custom.dispatchFetch( + new Request('/request-to-handle'), + ) +} +``` + +:::warning +Vite は、`dispatchFetch` メソッドの入力と出力を検証します。リクエストはグローバル `Request` クラスのインスタンスである必要があり、レスポンスはグローバル `Response` クラスのインスタンスである必要があります。そうでない場合、Vite は `TypeError` をスローします。 + +`FetchableDevEnvironment` はクラスとして実装されていますが、Vite チームからは実装の詳細と見なされており、いつでも変更される可能性があることに注意してください。 +::: + +### 未加工の `DevEnvironment` + +環境が `RunnableDevEnvironment` または `FetchableDevEnvironment` インターフェースを実装していない場合は、手動で通信を設定する必要があります。 + +ユーザーモジュールと同じランタイムでコードを実行できる場合(つまり、Node.js 固有の API に依存しない場合)、仮想モジュールを使用できます。このアプローチにより、Vite の API を使用してコードから値にアクセスする必要がなくなります。 + +```ts +// Vite の API を使用するコード +import { createServer } from 'vite' + +const server = createServer({ + plugins: [ + // `virtual:entrypoint` を処理するプラグイン + { + name: 'virtual-module', + /* プラグインの実装 */ + }, + ], +}) +const ssrEnvironment = server.environment.ssr +const input = {} + +// コードを実行する各環境ファクトリーによって公開されている関数を使用します +// 各環境ファクトリーについて、それらが提供するものをチェックします +if (ssrEnvironment instanceof CustomDevEnvironment) { + ssrEnvironment.runEntrypoint('virtual:entrypoint') +} else { + throw new Error(`Unsupported runtime for ${ssrEnvironment.name}`) +} + +// ------------------------------------- +// virtual:entrypoint +const { createHandler } = await import('./entrypoint.js') +const handler = createHandler(input) +const response = handler(new Request('/')) + +// ------------------------------------- +// ./entrypoint.js +export function createHandler(input) { + return function handler(req) { + return new Response('hello') + } +} +``` + +たとえば、ユーザーモジュールで `transformIndexHtml` を呼び出すには、次のプラグインを使用できます: + +```ts {13-21} +function vitePluginVirtualIndexHtml(): Plugin { + let server: ViteDevServer | undefined + return { + name: vitePluginVirtualIndexHtml.name, + configureServer(server_) { + server = server_ + }, + resolveId(source) { + return source === 'virtual:index-html' ? '\0' + source : undefined + }, + async load(id) { + if (id === '\0' + 'virtual:index-html') { + let html: string + if (server) { + this.addWatchFile('index.html') + html = fs.readFileSync('index.html', 'utf-8') + html = await server.transformIndexHtml('/', html) + } else { + html = fs.readFileSync('dist/client/index.html', 'utf-8') + } + return `export default ${JSON.stringify(html)}` + } + return + }, + } +} +``` + +コードに Node.js API が必要な場合は、`hot.send` を使用して、ユーザーモジュールから Vite の API を使用するコードと通信できます。ただし、このアプローチはビルドプロセス後に同じように機能しない可能性があることに注意してください。 + +```ts +// Vite の API を使用するコード +import { createServer } from 'vite' + +const server = createServer({ + plugins: [ + // `virtual:entrypoint` を処理するプラグイン + { + name: 'virtual-module', + /* プラグインの実装 */ + }, + ], +}) +const ssrEnvironment = server.environment.ssr +const input = {} + +// コードを実行する各環境ファクトリーによって公開されている関数を使用します +// 各環境ファクトリーについて、それらが提供するものをチェックします +if (ssrEnvironment instanceof RunnableDevEnvironment) { + ssrEnvironment.runner.import('virtual:entrypoint') +} else if (ssrEnvironment instanceof CustomDevEnvironment) { + ssrEnvironment.runEntrypoint('virtual:entrypoint') +} else { + throw new Error(`Unsupported runtime for ${ssrEnvironment.name}`) +} + +const req = new Request('/') + +const uniqueId = 'a-unique-id' +ssrEnvironment.send('request', serialize({ req, uniqueId })) +const response = await new Promise((resolve) => { + ssrEnvironment.on('response', (data) => { + data = deserialize(data) + if (data.uniqueId === uniqueId) { + resolve(data.res) + } + }) +}) + +// ------------------------------------- +// virtual:entrypoint +const { createHandler } = await import('./entrypoint.js') +const handler = createHandler(input) + +import.meta.hot.on('request', (data) => { + const { req, uniqueId } = deserialize(data) + const res = handler(req) + import.meta.hot.send('response', serialize({ res: res, uniqueId })) +}) + +const response = handler(new Request('/')) + +// ------------------------------------- +// ./entrypoint.js +export function createHandler(input) { + return function handler(req) { + return new Response('hello') + } +} +``` + +## ビルド中の環境 {#environments-during-build} + +CLI において、`vite build` と `vite build --ssr` を呼び出すと、後方互換性のためにクライアントのみの環境と ssr のみの環境がビルドされます。 + +`builder` が `undefined` でない場合(または `vite build --app` を呼び出した場合)、`vite build` はアプリ全体のビルドを行います。これは将来のメジャーバージョンではデフォルトになる予定です。`ViteBuilder` インスタンス(ビルド時の `ViteDevServer` に相当)が作成され、プロダクション環境用に設定されたすべての環境がビルドされます。デフォルトでは、環境のビルドは `environments` レコードの順番に従って直列に実行されます。フレームワークやユーザーは環境を構築する方法を設定できます: + +```js +export default { + builder: { + buildApp: async (builder) => { + const environments = Object.values(builder.environments) + await Promise.all( + environments.map((environment) => builder.build(environment)), + ) + }, + }, +} +``` + +プラグインは `buildApp` フックを定義することもできます。order が `'pre'` および `null` のフックは、設定された `builder.buildApp` の前に実行され、`'post'` のフックはその後で実行されます。`environment.isBuilt` を使用して、環境がすでにビルドされているかどうかを確認できます。 + +## 環境に依存しないコード {#environment-agnostic-code} + +ほとんどの場合、現在の `environment` インスタンスは実行中のコードのコンテキストの一部として利用できるため、`server.environments` を介してアクセスする必要はほとんどありません。たとえば、プラグインフック内では、環境は `PluginContext` の一部として公開されるため、`this.environment` を使用してアクセスできます。環境対応プラグインの構築方法については、[プラグイン向けの Environment API](./api-environment-plugins.md) を参照してください。 diff --git a/guide/api-environment-instances.md b/guide/api-environment-instances.md new file mode 100644 index 00000000..7db34192 --- /dev/null +++ b/guide/api-environment-instances.md @@ -0,0 +1,212 @@ +# `Environment` インスタンスの使用 + +:::info Release Candidate +Environment API は一般的にリリース候補段階にあります。エコシステムがそれらを実験し、構築できるように、メジャーリリース間での API の安定性を維持します。ただし、[一部の特定の API](/changes/#considering) はまだ実験的であることに注意してください。 + +ダウンストリームプロジェクトが新しい機能を実験し、それらを検証する時間を持った後、将来のメジャーリリースでこれらの新しい API を安定化する予定です(破壊的変更を含む可能性あり)。 + +リソース: + +- 新しい API に関するフィードバックを収集する [Feedback discussion](https://github.com/vitejs/vite/discussions/16358) +- 新しい API が実装され、レビューされる [Environment API PR](https://github.com/vitejs/vite/pull/16471) + +ぜひフィードバックをお寄せください。 +::: + +## 環境へのアクセス {#accessing-the-environments} + +開発中は、`server.environments` を使用して開発サーバー内の利用可能な環境にアクセスできます: + +```js +// サーバーを作成するか、configureServer フックから取得する +const server = await createServer(/* オプション */) + +const clientEnvironment = server.environments.client +clientEnvironment.transformRequest(url) +console.log(server.environments.ssr.moduleGraph) +``` + +プラグインから現在の環境にアクセスすることもできます。詳細については、[プラグイン向けの Environment API](./api-environment-plugins.md#accessing-the-current-environment-in-hooks) を参照してください。 + +## `DevEnvironment` クラス {#devenvironment-class} + +開発中、各環境は `DevEnvironment` クラスのインスタンスです: + +```ts +class DevEnvironment { + /** + * Vite サーバー内の環境の一意な識別子。 + * デフォルトでは、Vite は 'client' と 'ssr' 環境を公開します。 + */ + name: string + /** + * ターゲットランタイム内の関連モジュールランナーから + * メッセージを送受信するための通信チャネル。 + */ + hot: NormalizedHotChannel + /** + * 処理されたモジュールと処理されたコードのキャッシュ結果との間の + * インポートされた関係を示すモジュールノードのグラフ。 + */ + moduleGraph: EnvironmentModuleGraph + /** + * この環境の解決済みプラグイン。 + * 環境ごとの `create` フックを使って作成されたものも含む。 + */ + plugins: Plugin[] + /** + * 環境プラグインパイプラインを通じて、 + * コードの解決、ロード、変換を可能にする + */ + pluginContainer: EnvironmentPluginContainer + /** + * この環境の解決された設定オプション。 + * サーバーのグローバルスコープのオプションはすべての環境のデフォルトとして扱われ、 + * オーバーライドすることができます (resolve conditions、external、optimizedDeps)。 + */ + config: ResolvedConfig & ResolvedDevEnvironmentOptions + + constructor( + name: string, + config: ResolvedConfig, + context: DevEnvironmentContext, + ) + + /** + * URL を id に解決してロードし、プラグインパイプラインを使ってコードを処理する。 + * モジュールグラフも更新されます。 + */ + async transformRequest(url: string): Promise + + /** + * 低い優先度で処理されるリクエストを登録します。ウォーターフォールを回避するのに + * 役立ちます。Vite サーバーは他のリクエストによってインポートされたモジュールに関する + * 情報を持っているため、モジュールがリクエストされたときにすでに処理されているよう、 + * モジュールグラフをウォームアップできます。 + */ + async warmupRequest(url: string): Promise +} +``` + +`DevEnvironmentContext` は次のようになります: + +```ts +interface DevEnvironmentContext { + hot: boolean + transport?: HotChannel | WebSocketServer + options?: EnvironmentOptions + remoteRunner?: { + inlineSourceMap?: boolean + } + depsOptimizer?: DepsOptimizer +} +``` + +そして `TransformResult` は: + +```ts +interface TransformResult { + code: string + map: SourceMap | { mappings: '' } | null + etag?: string + deps?: string[] + dynamicDeps?: string[] +} +``` + +Vite サーバーの環境インスタンスでは、`environment.transformRequest(url)` メソッドを使用して URL を処理できます。この関数はプラグインパイプラインを使用して `url` をモジュール `id` に解決し、(ファイルシステムからファイルを読み込むか、仮想モジュールを実装するプラグインを介して)モジュールをロードし、コードを変換します。モジュールを変換している間、インポートやその他のメタデータは、対応するモジュールノードを作成または更新することで、環境モジュールグラフに記録されます。処理が完了すると、変換結果もモジュールに保存されます。 + +:::info transformRequest の命名 +この提案の現在のバージョンでは `transformRequest(url)` と `warmupRequest(url)` を使っているので、Vite の現在の API に慣れているユーザーにとっては議論しやすく、理解しやすいと思います。リリースする前に、これらの名前を見直す機会を設ける可能性があります。例えば、プラグインフックで Rollup の `context.load(id)` からページを取得する `environment.processModule(url)` や `environment.loadModule(url)` という名前にすることもできます。今のところは現在の名前のままで、この議論を遅らせる方が良いと考えています。 +::: + +## 独立したモジュールグラフ {#separate-module-graphs} + +各環境は独立したモジュールグラフを持ちます。すべてのモジュールグラフは同じシグネチャーを持つので、環境に依存せずにグラフをクロールしたりクエリしたりする汎用的なアルゴリズムを実装できます。`hotUpdate` が良い例です。ファイルが変更されると、各環境のモジュールグラフを使用して、影響を受けるモジュールを検出し、各環境に対して個別に HMR を実行します。 + +::: info +Vite v5 ではクライアントと SSR のモジュールグラフが混在していました。未処理のノードや無効化されたノードがあった場合、それがクライアントに対応するのか、SSR に対応するのか、あるいは両方の環境に対応するのかを知ることはできません。モジュールノードには、`clientImportedModules` や `ssrImportedModules` (および両者の和を返す `importedModules`) のようなプレフィックス付きのプロパティがあります。`importers` には、各モジュールノードのクライアントと SSR 環境のすべてのインポーターが含まれます。モジュールノードには `transformResult` と `ssrTransformResult` もあります。後方互換性レイヤーはエコシステムが非推奨の `server.moduleGraph` から移行できます。 +::: + +各モジュールは `EnvironmentModuleNode` インスタンスで表現されます。モジュールはまだ処理されていなくてもグラフに登録できます(その場合 `transformResult` は `null` となります)。モジュールが処理されると `importers` と `importedModules` も更新されます。 + +```ts +class EnvironmentModuleNode { + environment: string + + url: string + id: string | null = null + file: string | null = null + + type: 'js' | 'css' + + importers = new Set() + importedModules = new Set() + importedBindings: Map> | null = null + + info?: ModuleInfo + meta?: Record + transformResult: TransformResult | null = null + + acceptedHmrDeps = new Set() + acceptedHmrExports: Set | null = null + isSelfAccepting?: boolean + lastHMRTimestamp = 0 + lastInvalidationTimestamp = 0 +} +``` + +`environment.moduleGraph` は `EnvironmentModuleGraph` のインスタンスです: + +```ts +export class EnvironmentModuleGraph { + environment: string + + urlToModuleMap = new Map() + idToModuleMap = new Map() + etagToModuleMap = new Map() + fileToModulesMap = new Map>() + + constructor( + environment: string, + resolveId: (url: string) => Promise, + ) + + async getModuleByUrl( + rawUrl: string, + ): Promise + + getModuleById(id: string): EnvironmentModuleNode | undefined + + getModulesByFile(file: string): Set | undefined + + onFileChange(file: string): void + + onFileDelete(file: string): void + + invalidateModule( + mod: EnvironmentModuleNode, + seen: Set = new Set(), + timestamp: number = monotonicDateNow(), + isHmr: boolean = false, + ): void + + invalidateAll(): void + + async ensureEntryFromUrl( + rawUrl: string, + setIsSelfAccepting = true, + ): Promise + + createFileOnlyEntry(file: string): EnvironmentModuleNode + + async resolveUrl(url: string): Promise + + updateModuleTransformResult( + mod: EnvironmentModuleNode, + result: TransformResult | null, + ): void + + getModuleByEtag(etag: string): EnvironmentModuleNode | undefined +} +``` diff --git a/guide/api-environment-plugins.md b/guide/api-environment-plugins.md new file mode 100644 index 00000000..453cfeba --- /dev/null +++ b/guide/api-environment-plugins.md @@ -0,0 +1,267 @@ +# プラグイン向けの Environment API + +:::info Release Candidate +Environment API は一般的にリリース候補段階にあります。エコシステムがそれらを実験し、構築できるように、メジャーリリース間での API の安定性を維持します。ただし、[一部の特定の API](/changes/#considering) はまだ実験的であることに注意してください。 + +ダウンストリームプロジェクトが新しい機能を実験し、それらを検証する時間を持った後、将来のメジャーリリースでこれらの新しい API を安定化する予定です(破壊的変更を含む可能性あり)。 + +リソース: + +- 新しい API に関するフィードバックを収集する [Feedback discussion](https://github.com/vitejs/vite/discussions/16358) +- 新しい API が実装され、レビューされる [Environment API PR](https://github.com/vitejs/vite/pull/16471) + +ぜひフィードバックをお寄せください。 +::: + +## フック内で現在の環境にアクセスする {} + +Vite 6 までは環境が 2 つ (`client` と `ssr`) しかなかったため、Vite API の現在の環境を識別するのは `ssr` ブール値で十分でした。プラグインフックは最後のオプションパラメーターで `ssr` ブール値を受け取り、いくつかの API はモジュールを正しい環境に適切に関連付けるためにオプションの最後の `ssr` パラメーターを必要としていました (たとえば、`server.moduleGraph.getModuleByUrl(url, { ssr })`)。 + +設定可能な環境の登場により、プラグイン内のオプションやインスタンスにアクセスするための統一された方法が用意されました。プラグインフックはコンテキスト内で `this.environment` を公開するようになり、以前は `ssr` ブール値を期待していた API は適切な環境にスコープされるようになりました (たとえば `environment.moduleGraph.getModuleByUrl(url)`)。 + +Vite サーバーには共有プラグインパイプラインがありますが、モジュールが処理されるときは常に特定の環境のコンテキストで実行されます。`environment` インスタンスはプラグインコンテキストで使用できます。 + +プラグインは、`environment` インスタンスを使用して、環境の設定(`environment.config` を使用してアクセス可能)に応じてモジュールの処理方法を変更できます。 + +```ts + transform(code, id) { + console.log(this.environment.config.resolve.conditions) + } +``` + +## フックを使用して新しい環境を登録する {#registering-new-environments-using-hooks} + +プラグインは、`config` フックに新しい環境を追加できます。例えば、[RSC サポート](/plugins/#vitejs-plugin-rsc) では、`react-server` 条件を含む個別のモジュールグラフを持つために追加の環境を使用します: + +```ts + config(config: UserConfig) { + return { + environments: { + rsc: { + resolve: { + conditions: ['react-server', ...defaultServerConditions], + }, + }, + }, + } + } +``` + +環境を登録するには空のオブジェクトで十分で、デフォルト値はルートレベルの環境設定から取得されます。 + +## フックを使用した環境の設定 {#configuring-environment-using-hooks} + +`config` フックが実行されている間、環境の完全なリストはまだ分かっておらず、環境はルートレベルの環境設定からのデフォルト値、または `config.environments` レコードを通して明示的に影響を受ける可能性があります。 +プラグインは `config` フックを使ってデフォルト値を設定してください。各環境を設定するには、新しい `configEnvironment` フックを使用します。このフックは、最終的なデフォルト値の解決を含む、部分的に解決された設定を持つ各環境に対して呼び出されます。 + +```ts + configEnvironment(name: string, options: EnvironmentOptions) { + // rsc 環境に "workerd" 条件を追加 + if (name === 'rsc') { + return { + resolve: { + conditions: ['workerd'], + }, + } + } + } +``` +``` + +## `hotUpdate` フック {#the-hotupdate-hook} + +- **型:** `(this: { environment: DevEnvironment }, options: HotUpdateOptions) => Array | void | Promise | void>` +- **種類:** `async`、`sequential` +- **参照:** [HMR API](./api-hmr) + +`hotUpdate` フックを使用すると、プラグインが指定された環境に対してカスタム HMR 更新処理を実行できるようになります。ファイルが変更されると、HMR アルゴリズムは `server.environments` の順番に従って各環境で順に実行されるので、`hotUpdate` フックは複数回呼び出されることになります。このフックは以下のシグネチャを持つコンテキストオブジェクトを受け取ります: + +```ts +interface HotUpdateOptions { + type: 'create' | 'update' | 'delete' + file: string + timestamp: number + modules: Array + read: () => string | Promise + server: ViteDevServer +} +``` + +- `this.environment` は現在ファイルの更新が処理されているモジュール実行環境です。 + +- `modules` は、変更されたファイルの影響を受ける、この環境のモジュールの配列です。1 つのファイルが複数のモジュール(Vue SFC など)にマッピングされる可能性があるため、配列になっています。 + +- `read` はファイルの内容を返す非同期の読み込み関数です。システムによっては、エディターがファイルの更新を終了する前にファイル変更コールバックが高速に実行され、`fs.readFile` が空の内容を返すことがあるためです。渡された読み込み関数はこの動作を正常化します。 + +フックは以下を選択できます: + +- HMR がより正確になるように、影響を受けるモジュールリストをフィルタリングして絞り込む。 + +- 空の配列を返し、フルリロードを実行する: + + ```js + hotUpdate({ modules, timestamp }) { + if (this.environment.name !== 'client') + return + + // モジュールを手動で無効化 + const invalidatedModules = new Set() + for (const mod of modules) { + this.environment.moduleGraph.invalidateModule( + mod, + invalidatedModules, + timestamp, + true + ) + } + this.environment.hot.send({ type: 'full-reload' }) + return [] + } + ``` + +- 空の配列を返し、カスタムイベントをクライアントに送信することで、完全なカスタム HMR 処理を行う: + + ```js + hotUpdate() { + if (this.environment.name !== 'client') + return + + this.environment.hot.send({ + type: 'custom', + event: 'special-update', + data: {} + }) + return [] + } + ``` + + クライアントコードは [HMR API](./api-hmr) を使って対応するハンドラーを登録する必要があります(これは同じプラグインの `transform` フックによって注入できます): + + ```js + if (import.meta.hot) { + import.meta.hot.on('special-update', (data) => { + // カスタム更新を実行する + }) + } + ``` + +## プラグインにおける環境ごとの状態 {#per-environment-state-in-plugins} + +同じプラグインインスタンスが異なる環境で使用されるため、プラグインの状態は `this.environment` をキーとして管理する必要があります。これは、エコシステムがクライアントモジュールと SSR モジュールの状態が混ざるのを避けるために、`ssr` ブール値をキーとしてモジュールの状態を保持するために既に使用しているパターンと同じです。`Map` を使用して、各環境の状態を個別に保持できます。後方互換性のため、`buildStart` および `buildEnd` は、`perEnvironmentStartEndDuringDev: true` フラグがない場合、クライアント環境に対してのみ呼び出されることに注意してください。 + +```js +function PerEnvironmentCountTransformedModulesPlugin() { + const state = new Map() + return { + name: 'count-transformed-modules', + perEnvironmentStartEndDuringDev: true, + buildStart() { + state.set(this.environment, { count: 0 }) + }, + transform(id) { + state.get(this.environment).count++ + }, + buildEnd() { + console.log(this.environment.name, state.get(this.environment).count) + } + } +} +``` + +## 環境ごとのプラグイン {#per-environment-plugins} + +プラグインは `applyToEnvironment` 関数で、適用する環境を定義できます。 + +```js +const UnoCssPlugin = () => { + // 共有グローバル状態 + return { + buildStart() { + // WeakMap, this.environment を使って + // 環境ごとの状態を初期化 + }, + configureServer() { + // グローバルフックを通常どおり使用 + }, + applyToEnvironment(environment) { + // このプラグインがこの環境でアクティブになる必要がある場合は true を返し、 + // そうでない場合は、それを置き換える新しいプラグインを返します。 + // フックが使用されていない場合、プラグインはすべての環境でアクティブになります + }, + resolveId(id, importer) { + // このプラグインが適用される環境に対してのみ呼び出されます + }, + } +} +``` + +プラグインが環境を認識せず、現在の環境に基づかない状態を持っている場合、`applyToEnvironment` フックを利用することで、簡単に環境別に対応するものに変えられます。 + +```js +import { nonShareablePlugin } from 'non-shareable-plugin' + +export default defineConfig({ + plugins: [ + { + name: 'per-environment-plugin', + applyToEnvironment(environment) { + return nonShareablePlugin({ outputName: environment.name }) + }, + }, + ], +}) +``` + +以下のような他のフックが不要なケースを簡略化するために、Vite は `perEnvironmentPlugin` ヘルパーをエクスポートしています: + +```js +import { nonShareablePlugin } from 'non-shareable-plugin' + +export default defineConfig({ + plugins: [ + perEnvironmentPlugin('per-environment-plugin', (environment) => + nonShareablePlugin({ outputName: environment.name }), + ), + ], +}) +``` + +`applyToEnvironment` フックは設定時に呼び出されます。エコシステム内のプロジェクトがプラグインを変更しているため、現在は `configResolved` の後に呼び出されています。環境プラグインの解決は、将来的には `configResolved` の前に移動される可能性があります。 + +## ビルドフックの環境 {#environment-in-build-hooks} + +開発時と同じように、プラグインフックもビルド時に環境インスタンスを受け取り、`ssr` ブール値を置き換えます。 +これは `renderChunk` や `generateBundle` などのビルド専用のフックでも動作します。 + +## ビルド時の共有プラグイン {#shared-plugins-during-build} + +Vite 6 以前は、プラグインパイプラインは開発時とビルド時に異なる方法で動作していました: + +- **開発時:** プラグインは共有されます +- **ビルド時:** プラグインは環境ごとに分離されます(`vite build` と `vite build --ssr` という別々のプロセスで分離されます)。 + +このため、フレームワークはファイルシステムに書き込まれたマニフェストファイルを通して `client` ビルドと `ssr` ビルドの間で状態を共有することを余儀なくされていました。Vite 6 では、すべての環境を単一のプロセスでビルドするようになったので、プラグインのパイプラインと環境間通信の方法を開発時と合わせることができるようになりました。 + +将来のメジャーでは、完全な整合性が実現するかも知れません: + +- **開発時とビルド時:** プラグインは[環境ごとのフィルタリング](#per-environment-plugins)で共有されます + +また、ビルド時に共有される `ResolvedConfig` インスタンスは 1 つになり、開発時に `WeakMap` を使っていたのと同じように、アプリのビルドプロセスレベル全体でキャッシュが可能になります。 + +Vite 6 では、後方互換性を保つために小さなステップを行う必要があります。エコシステムのプラグインは現在、設定へアクセスするために `environment.config.build` ではなく `config.build` を使用しているため、デフォルトでは環境ごとに新しい `ResolvedConfig` を作成する必要があります。プロジェクトは `builder.sharedConfigBuild` を `true` に設定することで、完全な設定とプラグインパイプラインを共有できます。 + +このオプションは、最初のうちは小さなプロジェクトのサブセットでしか機能しないため、プラグインの作者は `sharedDuringBuild` フラグを `true` に設定することで、特定のプラグインを共有するように選択できます。これにより、通常のプラグインでも簡単に状態を共有できるようになります: + +```js +function myPlugin() { + // 開発環境とビルド環境のすべての環境で状態を共有する + const sharedState = ... + return { + name: 'shared-plugin', + transform(code, id) { ... }, + + // すべての環境で単一のインスタンスにオプトインする + sharedDuringBuild: true, + } +} +``` diff --git a/guide/api-environment-runtimes.md b/guide/api-environment-runtimes.md new file mode 100644 index 00000000..2d6b8a68 --- /dev/null +++ b/guide/api-environment-runtimes.md @@ -0,0 +1,408 @@ +# ランタイム向けの Environment API + +:::info Release Candidate +Environment API は一般的にリリース候補段階にあります。エコシステムがそれらを実験し、構築できるように、メジャーリリース間での API の安定性を維持します。ただし、[一部の特定の API](/changes/#considering) はまだ実験的であることに注意してください。 + +ダウンストリームプロジェクトが新しい機能を実験し、それらを検証する時間を持った後、将来のメジャーリリースでこれらの新しい API を安定化する予定です(破壊的変更を含む可能性あり)。 + +リソース: + +- 新しい API に関するフィードバックを収集する [Feedback discussion](https://github.com/vitejs/vite/discussions/16358) +- 新しい API が実装され、レビューされる [Environment API PR](https://github.com/vitejs/vite/pull/16471) + +ぜひフィードバックをお寄せください。 +::: + +## 環境ファクトリー {#environment-factories} + +環境ファクトリーは、エンドユーザーではなく、Cloudflare などの環境プロバイダーによって実装されることを目的としています。環境ファクトリーは、開発環境とビルド環境の両方でターゲットランタイムを使用する最も一般的なケースで、`EnvironmentOptions` を返します。デフォルトの環境オプションも設定できるため、ユーザーが設定する必要はありません。 + +```ts +function createWorkerdEnvironment( + userConfig: EnvironmentOptions, +): EnvironmentOptions { + return mergeConfig( + { + resolve: { + conditions: [ + /*...*/ + ], + }, + dev: { + createEnvironment(name, config) { + return createWorkerdDevEnvironment(name, config, { + hot: true, + transport: customHotChannel(), + }) + }, + }, + build: { + createEnvironment(name, config) { + return createWorkerdBuildEnvironment(name, config) + }, + }, + }, + userConfig, + ) +} +``` + +設定ファイルは次のように記述できます: + +```js +import { createWorkerdEnvironment } from 'vite-environment-workerd' + +export default { + environments: { + ssr: createWorkerdEnvironment({ + build: { + outDir: '/dist/ssr', + }, + }), + rsc: createWorkerdEnvironment({ + build: { + outDir: '/dist/rsc', + }, + }), + }, +} +``` + +フレームワークは次のコードを使用して、workerd ランタイム環境で SSR を実行できます: + +```js +const ssrEnvironment = server.environments.ssr +``` + +## 新しい環境ファクトリーの作成 {#creating-a-new-environment-factory} + +Vite 開発サーバーは、デフォルトで `client` 環境と `ssr` 環境の 2 つの環境を公開します。クライアント環境はデフォルトではブラウザー環境であり、モジュールランナーは仮想モジュール `/@vite/client` をクライアントアプリにインポートすることによって実装されます。SSR 環境は、デフォルトでは Vite サーバーと同じ Node ランタイムで実行され、開発時は完全な HMR サポートによって、アプリケーションサーバーを使用してリクエストをレンダリングできます。 + +変換されたソースコードはモジュールと呼ばれ、各環境で処理されるモジュール間の関係はモジュールグラフに保持されます。これらのモジュールの変換されたコードは、実行される各環境に関連付けられたランタイムに送信されます。ランタイムでモジュールが評価されると、そのモジュールにインポートされたモジュールがリクエストされ、モジュールグラフのセクションの処理がトリガーされます。 + +Vite モジュールランナーは、最初に Vite プラグインで処理することで、任意のコードを実行できます。ランナーの実装がサーバーから分離されている点が `server.ssrLoadModule` とは異なります。これによりライブラリーおよびフレームワークの作者は、Vite サーバーとランナー間の通信レイヤーを実装できます。ブラウザーは、サーバーの WebSocket と HTTP リクエストを使用して、対応する環境と通信します。Node モジュールランナーは、同じプロセスで実行されているため、モジュールを処理するために関数呼び出しを直接実行できます。他の環境では、workerd などの JS ランタイムに接続するモジュール、または Vitest のようなワーカースレッドを実行するモジュールを実行できます。 + +この機能の目的の 1 つは、コードを処理および実行するためのカスタマイズ可能な API を提供することです。ユーザーは、公開されたプリミティブを使用して新しい環境ファクトリーを作成できます。 + +```ts +import { DevEnvironment, HotChannel } from 'vite' + +function createWorkerdDevEnvironment( + name: string, + config: ResolvedConfig, + context: DevEnvironmentContext +) { + const connection = /* ... */ + const transport: HotChannel = { + on: (listener) => { connection.on('message', listener) }, + send: (data) => connection.send(data), + } + + const workerdDevEnvironment = new DevEnvironment(name, config, { + options: { + resolve: { conditions: ['custom'] }, + ...context.options, + }, + hot: true, + transport, + }) + return workerdDevEnvironment +} +``` + +`DevEnvironment` には [複数の通信レベル](/guide/api-environment-frameworks#devenvironment-communication-levels) があります。フレームワークがランタイムに依存しないコードを簡単に記述できるように、可能な限り柔軟な通信レベルを実装することをお勧めします。 + +## `ModuleRunner` + +モジュールランナーはターゲットランタイムでインスタンス化されます。次のセクションの全ての API は、特に断りのない限り `vite/module-runner` からインポートされます。このエクスポート・エントリーポイントは可能な限り軽量に保たれており、モジュールランナーを作成するために必要な最小限のものだけがエクスポートされます。 + +**型シグネチャー:** + +```ts +export class ModuleRunner { + constructor( + public options: ModuleRunnerOptions, + public evaluator: ModuleEvaluator = new ESModulesEvaluator(), + private debug?: ModuleRunnerDebugger, + ) {} + /** + * 実行する URL。 + * ルートからの相対的なファイルパス、サーバーパス、ID を受け付けます。 + */ + public async import(url: string): Promise + /** + * HMR リスナーを含むすべてのキャッシュをクリアします。 + */ + public clearCache(): void + /** + * 全キャッシュをクリア、全 HMR リスナーを削除、ソースマップサポートをリセットします。 + * このメソッドは HMR 接続を停止しません。 + */ + public async close(): Promise + /** + * `close()` を呼び出してランナーを終了した場合は `true` を返します。 + */ + public isClosed(): boolean +} +``` + +`ModuleRunner` のモジュール評価機能はコードの実行を担当します。Vite は `ESModulesEvaluator` をエクスポートしており、`new AsyncFunction` を使用してコードを評価します。JavaScript ランタイムが安全でない評価をサポートしていない場合は、独自の実装を提供できます。 + +モジュールランナーは `import` メソッドを公開します。Vite サーバーが `full-reload` HMR イベントをトリガーすると、影響を受けるすべてのモジュールが再実行されます。このとき、モジュールランナーは `exports` オブジェクトを更新しないことに注意してください(上書きされます)。最新の `exports` オブジェクトが必要であれば、 `import` を実行するか、もう一度 `evaluatedModules` からモジュールを取得する必要があります。 + +**使用例:** + +```js +import { + ModuleRunner, + ESModulesEvaluator, + createNodeImportMeta, +} from 'vite/module-runner' +import { transport } from './rpc-implementation.js' + +const moduleRunner = new ModuleRunner( + { + transport, + createImportMeta: createNodeImportMeta, // モジュールランナーが Node.js で実行される場合 + }, + new ESModulesEvaluator(), +) + +await moduleRunner.import('/src/entry-point.js') +``` + +## `ModuleRunnerOptions` + +```ts twoslash +import type { + InterceptorOptions as InterceptorOptionsRaw, + ModuleRunnerHmr as ModuleRunnerHmrRaw, + EvaluatedModules, +} from 'vite/module-runner' +import type { Debug } from '@type-challenges/utils' + +type InterceptorOptions = Debug +type ModuleRunnerHmr = Debug +/** 下記参照 */ +type ModuleRunnerTransport = unknown + +// ---cut--- +interface ModuleRunnerOptions { + /** + * サーバーと通信するための一連のメソッド。 + */ + transport: ModuleRunnerTransport + /** + * ソースマップの解決方法を設定します。 + * `process.setSourceMapsEnabled` が使用可能な場合は `node` を優先します。 + * それ以外の場合は、デフォルトで `prepareStackTrace` を使用し、 + * `Error.prepareStackTrace` メソッドをオーバーライドします。 + * Vite によって処理されなかったファイルのファイル内容とソースマップの解決方法を設定する + * オブジェクトを提供できます。 + */ + sourcemapInterceptor?: + | false + | 'node' + | 'prepareStackTrace' + | InterceptorOptions + /** + * HMR を無効にするか、HMR オプションを設定します。 + * + * @default true + */ + hmr?: boolean | ModuleRunnerHmr + /** + * カスタムモジュールキャッシュ。指定されていない場合は、モジュールランナーの + * インスタンスごとに個別のモジュールキャッシュが作成されます。 + */ + evaluatedModules?: EvaluatedModules +} +``` + +## `ModuleEvaluator` + +**型シグネチャー:** + +```ts twoslash +import type { ModuleRunnerContext as ModuleRunnerContextRaw } from 'vite/module-runner' +import type { Debug } from '@type-challenges/utils' + +type ModuleRunnerContext = Debug + +// ---cut--- +export interface ModuleEvaluator { + /** + * 変換後のコードに含まれるプレフィックスの行数。 + */ + startOffset?: number + /** + * Vite によって変換されたコードを評価します。 + * @param context 関数コンテキスト + * @param code 変換されたコード + * @param id モジュールを取得するために使用された ID + */ + runInlinedModule( + context: ModuleRunnerContext, + code: string, + id: string, + ): Promise + /** + * 外部化されたモジュールを評価します。 + * @param file 外部モジュールへのファイル URL + */ + runExternalModule(file: string): Promise +} +``` + +Vite はデフォルトでこのインターフェイスを実装した `ESModulesEvaluator` をエクスポートします。コードの評価には `new AsyncFunction` を使用するので、インライン化されたソースマップがある場合は、新しい行が追加されたことを考慮して [2 行分のオフセット](https://tc39.es/ecma262/#sec-createdynamicfunction)を追加する必要があります。これは `ESModulesEvaluator` によって自動的に実行されます。カスタムの Evaluator は行を追加しません。 + +## `ModuleRunnerTransport` + +**型シグネチャー:** + +```ts twoslash +import type { ModuleRunnerTransportHandlers } from 'vite/module-runner' +/** オブジェクト */ +type HotPayload = unknown +// ---cut--- +interface ModuleRunnerTransport { + connect?(handlers: ModuleRunnerTransportHandlers): Promise | void + disconnect?(): Promise | void + send?(data: HotPayload): Promise | void + invoke?(data: HotPayload): Promise<{ result: any } | { error: any }> + timeout?: number +} +``` + +RPC 経由または関数を直接呼び出して環境と通信するトランスポートオブジェクト。`invoke` メソッドが実装されていない場合、`send` メソッドと `connect` メソッドの実装が必須となります。Vite は内部で `invoke` を構築します。 + +次の例のように、モジュールランナーがワーカー スレッドで作成されるサーバー上の `HotChannel` インスタンスと結合する必要があります: + +::: code-group + +```js [worker.js] +import { parentPort } from 'node:worker_threads' +import { fileURLToPath } from 'node:url' +import { + ESModulesEvaluator, + ModuleRunner, + createNodeImportMeta, +} from 'vite/module-runner' + +/** @type {import('vite/module-runner').ModuleRunnerTransport} */ +const transport = { + connect({ onMessage, onDisconnection }) { + parentPort.on('message', onMessage) + parentPort.on('close', onDisconnection) + }, + send(data) { + parentPort.postMessage(data) + }, +} + +const runner = new ModuleRunner( + { + transport, + createImportMeta: createNodeImportMeta, + }, + new ESModulesEvaluator(), +) +``` + +```js [server.js] +import { BroadcastChannel } from 'node:worker_threads' +import { createServer, RemoteEnvironmentTransport, DevEnvironment } from 'vite' + +function createWorkerEnvironment(name, config, context) { + const worker = new Worker('./worker.js') + const handlerToWorkerListener = new WeakMap() + + const workerHotChannel = { + send: (data) => worker.postMessage(data), + on: (event, handler) => { + if (event === 'connection') return + + const listener = (value) => { + if (value.type === 'custom' && value.event === event) { + const client = { + send(payload) { + worker.postMessage(payload) + }, + } + handler(value.data, client) + } + } + handlerToWorkerListener.set(handler, listener) + worker.on('message', listener) + }, + off: (event, handler) => { + if (event === 'connection') return + const listener = handlerToWorkerListener.get(handler) + if (listener) { + worker.off('message', listener) + handlerToWorkerListener.delete(handler) + } + }, + } + + return new DevEnvironment(name, config, { + transport: workerHotChannel, + }) +} + +await createServer({ + environments: { + worker: { + dev: { + createEnvironment: createWorkerEnvironment, + }, + }, + }, +}) +``` + +::: + +HTTP リクエストを使用してランナーとサーバー間で通信する別の例: + +```ts +import { ESModulesEvaluator, ModuleRunner } from 'vite/module-runner' + +export const runner = new ModuleRunner( + { + transport: { + async invoke(data) { + const response = await fetch(`http://my-vite-server/invoke`, { + method: 'POST', + body: JSON.stringify(data), + }) + return response.json() + }, + }, + hmr: false, // HMR は transport.connect を必要とするため HMR を無効にする + }, + new ESModulesEvaluator(), +) + +await runner.import('/entry.js') +``` + +この場合、`NormalizedHotChannel` の `handleInvoke` メソッドを使用できます: + +```ts +const customEnvironment = new DevEnvironment(name, config, context) + +server.onRequest((request: Request) => { + const url = new URL(request.url) + if (url.pathname === '/invoke') { + const payload = (await request.json()) as HotPayload + const result = customEnvironment.hot.handleInvoke(payload) + return new Response(JSON.stringify(result)) + } + return Response.error() +}) +``` + +ただし、HMR をサポートするためには `send` メソッドと `connect` メソッドが必要です。`send` メソッドは通常、カスタムイベントがトリガーされたときに呼び出されます(`import.meta.hot.send("my-event")` のように)。 + +Vite は SSR 中の HMR をサポートするために、メインエントリーポイントから `createServerHotChannel` をエクスポートします。 diff --git a/guide/api-environment.md b/guide/api-environment.md new file mode 100644 index 00000000..7ab324c2 --- /dev/null +++ b/guide/api-environment.md @@ -0,0 +1,142 @@ +# Environment API + +:::info Release Candidate +Environment API は一般的にリリース候補段階にあります。エコシステムがそれらを実験し、構築できるように、メジャーリリース間での API の安定性を維持します。ただし、[一部の特定の API](/changes/#considering) はまだ実験的であることに注意してください。 + +ダウンストリームプロジェクトが新しい機能を実験し、それらを検証する時間を持った後、将来のメジャーリリースでこれらの新しい API を安定化する予定です(破壊的変更を含む可能性あり)。 + +リソース: + +- 新しい API に関するフィードバックを収集する [Feedback discussion](https://github.com/vitejs/vite/discussions/16358) +- 新しい API が実装され、レビューされる [Environment API PR](https://github.com/vitejs/vite/pull/16471) + +ぜひフィードバックをお寄せください。 +::: + +## 環境の形式化 {#formalizing-environments} + +Vite 6 では、環境の概念が正式化されました。Vite 5 までは、暗黙的な環境が 2 つ(`client` と省略可能な `ssr`)が存在していました。新しい Environment API を使用すると、ユーザーは必要な数の環境を作成して、アプリが本番環境でどのように動作するかをマッピングできます。この新しい機能には大規模な内部リファクタリングが必要でしたが、後方互換性にも多大な努力が払われました。Vite 6 の当初の目標は、エコシステムをできるだけスムーズに新しいメジャーに移行することであり、十分な数のユーザーが移行し、フレームワークとプラグインの作成者が新しい設計を検証するまで、これらの API の採用を遅らせます。 + +## ビルドと開発中のギャップを埋める {#closing-the-gap-between-build-and-dev} + +シンプルな SPA/MPA の場合、環境に関する新しい API は config に公開されません。内部的には、Vite はオプションを `client` 環境に適用しますが、Vite の設定時にこの概念を知っておく必要はありません。Vite 5 の設定と動作は、ここでもシームレスに機能するはずです。 + +典型的なサーバーサイドレンダリング(SSR)アプリに移行すると、2 つの環境が存在することになります: + +- `client`: ブラウザー内でアプリを実行します。 +- `ssr`: Node(または他のサーバーランタイム)内でアプリを実行し、ブラウザーに送信する前にページをレンダリングします。 + +開発環境では、Vite は Vite 開発サーバーと同じ Node プロセスでサーバーコードを実行し、プロダクション環境に近い環境を実現します。しかし、サーバーを他の JS ランタイムで実行することも可能であり、例えば [Cloudflare の workerd](https://github.com/cloudflare/workerd) など、制約が異なるものもあります。最近のアプリケーションは、ブラウザー、Node サーバー、Edge サーバーなど、2 つ以上の環境で実行されることもあります。 Vite 5 では、これらの環境を適切に表現できませんでした。 + +Vite 6 では、ビルドと開発中にアプリの設定を行ない、すべての環境をマッピングできます。開発中は単一の Vite 開発サーバーを使用して、複数の異なる環境で同時にコードを実行できるようになりました。アプリのソースコードは、引き続き Vite 開発サーバーによって変換されます。共有 HTTP サーバー、ミドルウェア、解決された設定、プラグインパイプラインに加えて、Vite 開発サーバーには独立した開発環境のセットが用意されています。各環境は、プロダクションにできるだけ近い形で構成され、コードが実行される開発ランタイムに接続されています(workerd の場合、サーバーコードはローカルで miniflare で実行できるようになりました)。クライアントでは、ブラウザーがコードをインポートして実行します。他の環境では、モジュールランナーが変換されたコードを取得して評価します。 + +![Vite Environments](../images/vite-environments.svg) + +## 環境設定 {#environments-configuration} + +SPA/MPA の場合、構成は Vite 5 と似たものになります。内部では、これらのオプションは `client` 環境の構成に使用されます。 + +```js +export default defineConfig({ + build: { + sourcemap: false, + }, + optimizeDeps: { + include: ['lib'], + }, +}) +``` + +これは、Vite を使いやすい状態に保ち、必要になるまで新しい概念を公開しないようにしたいため重要です。 + +アプリが複数の環境で構成されている場合、これらの環境は、`environments` 設定オプションで明示的に設定することができます。 + +```js +export default { + build: { + sourcemap: false, + }, + optimizeDeps: { + include: ['lib'], + }, + environments: { + server: {}, + edge: { + resolve: { + noExternal: true, + }, + }, + }, +} +``` + +明示的にドキュメント化されていない場合、環境は設定されたトップレベルのコンフィグオプションを継承します(例えば、新しい `server` および `edge` 環境は `build.sourcemap: false` オプションを継承します)。`optimizeDeps` などの少数のトップレベルオプションは、サーバー環境にデフォルトで適用するとうまく動作しないため、`client` 環境のみに適用されます。これらのオプションには、[リファレンス](/config/) で バッジが付いています。`client` 環境は `environments.client` を通して明示的に設定することもできますが、新しい環境を追加した際にクライアントの設定が変更されないように、トップレベルオプションを使用することをお勧めします。 + +`EnvironmentOptions` インターフェースは環境ごとのオプションをすべて公開します。`resolve` のように、`build` と `dev` の両方に適用される環境オプションもあります。また、`dev` と `build` に固有のオプション(`dev.warmup` や `build.outDir` など)には、`DevEnvironmentOptions` と `BuildEnvironmentOptions` があります。`optimizeDeps` のように、`dev` にのみ適用されるオプションもありますが、後方互換性を保つため、`dev` のネストではなくトップレベルとして維持されています。 + +```ts +interface EnvironmentOptions { + define?: Record + resolve?: EnvironmentResolveOptions + optimizeDeps: DepOptimizationOptions + consumer?: 'client' | 'server' + dev: DevOptions + build: BuildOptions +} +``` + +`UserConfig` インターフェースは `EnvironmentOptions` インターフェースを継承しており、`environments` オプションで設定されたクライアントと他の環境のデフォルトを設定することができます。`client` 環境と `ssr` という名前のサーバー環境は、開発時には常に存在します。これにより、`server.ssrLoadModule(url)` および `server.moduleGraph` との後方互換性が確保されます。ビルド時には、`client` 環境は常に存在し、`ssr` 環境は明示的に設定(`environments.ssr` または後方互換性のために `build.ssr` を使用)されている場合のみ存在します。アプリは SSR 環境に `ssr` という名前を使用する必要はなく、例えば `server` と名付けることもできます。 + +```ts +interface UserConfig extends EnvironmentOptions { + environments: Record + // その他のオプション +} +``` + +Environment API が安定したら、トップレベルプロパティ `ssr` が廃止予定になることに注意してください。このオプションは `environments` と同じ役割を持ちますが、デフォルトの `ssr` 環境に対してのみ、限られたオプションの設定のみが可能です。 + +## カスタム環境インスタンス {#custom-environment-instances} + +低レベルの設定 API が利用できるので、ランタイムプロバイダーはそれぞれのランタイムに適切なデフォルト設定の環境を提供することができます。これらの環境では、プロダクション環境に近いランタイムで開発中にモジュールを実行するために、他のプロセスやスレッドを生成することもできます。 + +```js +import { customEnvironment } from 'vite-environment-provider' + +export default { + build: { + outDir: '/dist/client', + }, + environments: { + ssr: customEnvironment({ + build: { + outDir: '/dist/ssr', + }, + }), + }, +} +``` + +## 後方互換性 {#backward-compatibility} + +現在の Vite サーバー API はまだ非推奨ではなく、Vite 5 との後方互換性があります。 + +`server.moduleGraph` はクライアントと ssr のモジュールグラフの混合ビューを返します。後方互換性のある混合モジュールノードがすべてのメソッドから返されます。同じスキームが `handleHotUpdate` に渡されるモジュールノードにも使用されます。 + +現時点では、Environment API への切り替えはまだお勧めしません。私たちは、プラグインが 2 つのバージョンを維持する必要がないように、ユーザーベースのかなりの部分が Vite 6 を採用することを目標としています。今後の廃止予定とアップグレードパスについては、今後の変更点をチェックしてください: + +- [フック内の `this.environment`](/changes/this-environment-in-hooks) +- [HMR `hotUpdate` プラグインフック](/changes/hotupdate-hook) +- [環境ごとの API への移行](/changes/per-environment-apis) +- [`ModuleRunner` API を使った SSR](/changes/ssr-using-modulerunner) +- [ビルド時の共有プラグイン](/changes/shared-plugins-during-build) + +## 対象ユーザー {#target-users} + +このガイドでは、エンドユーザー向けの環境に関する基本的な概念を説明します。 + +プラグイン作者は、現在の環境構成とやり取りするために、より一貫性のある API を利用できます。Vite をベースに構築している場合は、[Environment API プラグインガイド](./api-environment-plugins.md)で、拡張プラグイン API を使用して複数のカスタム環境をサポートする方法について説明します。 + +フレームワークは、さまざまなレベルで環境を公開することを決定できます。フレームワーク作者の場合は、[Environment API フレームワークガイド](./api-environment-frameworks)を読み進め、Environment API のプログラム的な側面について学習してください。 + +ランタイムプロバイダーの場合、[Environment API ランタイムガイド](./api-environment-runtimes.md)で、フレームワークとユーザーが使用するカスタム環境を提供する方法について説明します。 diff --git a/guide/api-hmr.md b/guide/api-hmr.md index 4d941c40..3f85981f 100644 --- a/guide/api-hmr.md +++ b/guide/api-hmr.md @@ -3,20 +3,23 @@ :::tip 注意 これはクライアント HMR の API です。プラグインでの HMR 更新処理については、[handleHotUpdate](./api-plugin#handlehotupdate) を参照してください。 -マニュアル HMR は主にフレームワークやツール作成者を対象としています。エンドユーザには、HMR はフレームワークによっては、スタータテンプレート内ですでに処理されていることがありえるでしょう。 +マニュアル HMR は主にフレームワークやツール作成者を対象としています。エンドユーザーには、HMR はフレームワークによっては、スタータテンプレート内ですでに処理されていることがありえるでしょう。 ::: Vite は特別な `import.meta.hot` オブジェクトを介して、マニュアル HMR の API を公開しています: -```ts +```ts twoslash +import type { ModuleNamespace } from 'vite/types/hot.d.ts' +import type { + CustomEventName, + InferCustomEventPayload, +} from 'vite/types/customEvent.d.ts' + +// ---cut--- interface ImportMeta { readonly hot?: ViteHotContext } -type ModuleNamespace = Record & { - [Symbol.toStringTag]: 'Module' -} - interface ViteHotContext { readonly data: any @@ -32,12 +35,18 @@ interface ViteHotContext { prune(cb: (data: any) => void): void invalidate(message?: string): void - // `InferCustomEventPayload` が組み込みの Vite イベント用の型を提供します - on( + on( + event: T, + cb: (payload: InferCustomEventPayload) => void, + ): void + off( event: T, cb: (payload: InferCustomEventPayload) => void, ): void - send(event: T, data?: InferCustomEventPayload): void + send( + event: T, + data?: InferCustomEventPayload, + ): void } ``` @@ -51,11 +60,25 @@ if (import.meta.hot) { } ``` +## TypeScript の IntelliSense + +Vite は `import.meta.hot` の型定義を [`vite/client.d.ts`](https://github.com/vitejs/vite/blob/main/packages/vite/client.d.ts) で提供しています。`tsconfig.json` に "vite/client" を追加することで、TypeScript が型定義を読み込むようになります: + +```json [tsconfig.json] +{ + "compilerOptions": { + "types": ["vite/client"] + } +} +``` + ## `hot.accept(cb)` 自身を受け入れるモジュールには、`import.meta.hot.accept` と更新されたモジュールを受け取るコールバックを使用します: -```js +```js twoslash +import 'vite/client' +// ---cut--- export const count = 1 if (import.meta.hot) { @@ -70,15 +93,21 @@ if (import.meta.hot) { ホットアップデートを「受け入れる」モジュールは、**HMR 境界**と見なされます。 -Vite の HMR は元々インポートされていたモジュールを実際に入れ替えるわけではないことに注意してください: HMR 境界モジュールが依存ファイルからのインポートを再エクスポートする場合、それらの再エクスポートを更新する責任があります(また、これらのエクスポートは `let` を使用しなければなりません)。さらに、境界モジュールよりも依存の上流でインポートしているモジュールには変更が通知されません。 +Vite の HMR は元々インポートされていたモジュールを実際に入れ替えるわけではありません: HMR 境界モジュールが依存ファイルからのインポートを再エクスポートする場合、それらの再エクスポートを更新する責任があります(また、これらのエクスポートは `let` を使用しなければなりません)。さらに、境界モジュールよりも依存の上流でインポートしているモジュールには変更が通知されません。この単純化された HMR の実装は、ほとんどの開発のユースケースに充分で、プロキシモジュールを生成するという重い処理を省くことができます。 -この単純化された HMR の実装は、ほとんどの開発のユースケースに充分で、プロキシモジュールを生成するという重い処理を省くことができます。 +Vite では、モジュールがアップデートを受け入れるために、この関数の呼び出しがソースコード中で `import.meta.hot.accept(`(空白を区別します)として表示される必要があります。これは、Vite がモジュールの HMR サポートを有効にするために行う静的解析の必要条件です。 ## `hot.accept(deps, cb)` モジュールは自身をリロードすることなく、直接の依存関係からの更新を受け入れることもできます: -```js +```js twoslash +// @filename: /foo.d.ts +export declare const foo: () => void + +// @filename: /example.js +import 'vite/client' +// ---cut--- import { foo } from './foo.js' foo() @@ -93,8 +122,9 @@ if (import.meta.hot) { import.meta.hot.accept( ['./foo.js', './bar.js'], ([newFooModule, newBarModule]) => { - // コールバックは、更新されたモジュールだけが null でない配列を受け取ります - // アップデートが成功しなかった場合(構文エラーなど)、配列は空となります + // コールバックは、更新されたモジュールだけが null でない配列を + // 受け取ります。アップデートが成功しなかった場合(構文エラーなど)、 + // 配列は空となります }, ) } @@ -104,7 +134,9 @@ if (import.meta.hot) { 自己受け入れモジュールや、他に受け入れられることを期待するモジュールは `hot.dispose` を使うことで、更新されたコピーによって生成された永続的な副作用をクリーンアップできます: -```js +```js twoslash +import 'vite/client' +// ---cut--- function setupSideEffect() {} setupSideEffect() @@ -120,7 +152,9 @@ if (import.meta.hot) { モジュールがページにインポートされなくなったときに呼び出されるコールバックを登録します。`hot.dispose` と比較すると、ソースコードが更新されたときに副作用をクリーンアップしてくれて、ページから削除されたときだけクリーンアップすればよい場合に使用できます。Vite では現在、 `.css` のインポートにこれを使用しています。 -```js +```js twoslash +import 'vite/client' +// ---cut--- function setupOrReuseSideEffect() {} setupOrReuseSideEffect() @@ -136,17 +170,31 @@ if (import.meta.hot) { `import.meta.hot.data` オブジェクトは、更新された同じモジュールの異なるインスタンス間で永続化されます。これは、モジュールの前のバージョンから次のバージョンに情報を渡すために使用できます。 +`data` 自体の再代入はサポートされていないことに注意してください。代わりに、`data` オブジェクトのプロパティを変更して、他のハンドラーから追加された情報が保持されるようにする必要があります。 + +```js twoslash +import 'vite/client' +// ---cut--- +// これは OK +import.meta.hot.data.someValue = 'hello' + +// サポートされていません +import.meta.hot.data = { someValue: 'hello' } +``` + ## `hot.decline()` これは現在何もせず、後方互換性のために存在しています。将来、新しい使い道があれば変更される可能性があります。モジュールがホットアップデート可能でないことを示すには、`hot.invalidate()` を使ってください。 ## `hot.invalidate(message?: string)` -自己受け入れモジュールは実行中に HMR の更新を処理できないことに気づくかもしれません。そのため、更新は強制的にインポータに伝搬される必要があります。`import.meta.hot.invalidate()` を呼ぶことで、HMR サーバは呼び出し元のインポーターを、呼び出し元が自己受け入れしていないかのように無効化します。これはブラウザのコンソールとターミナルの両方にメッセージを記録します。メッセージを渡すことで、なぜ無効化が起こったのかについてのコンテキストを与えることができます。 +自己受け入れモジュールは実行中に HMR の更新を処理できないことに気づくかもしれません。そのため、更新は強制的にインポーターに伝搬される必要があります。`import.meta.hot.invalidate()` を呼ぶことで、HMR サーバーは呼び出し元のインポーターを、呼び出し元が自己受け入れしていないかのように無効化します。これはブラウザーのコンソールとターミナルの両方にメッセージを記録します。メッセージを渡すことで、なぜ無効化が起こったのかについてのコンテキストを与えることができます。 その直後に `invalidate` を呼び出す場合でも、常に `import.meta.hot.accept` を呼び出す必要があることに注意してください。そうしないと、HMR クライアントは自己受け入れモジュールの今後の変更をリッスンしません。意図を明確に伝えるために、以下のように `accept` コールバック内で `invalidate` をコールすることを推奨します: -```js +```js twoslash +import 'vite/client' +// ---cut--- import.meta.hot.accept((module) => { // 新しいモジュールインスタンスを使用して、無効化するかどうかを決定できます。 if (cannotHandleUpdate(module)) { @@ -162,17 +210,30 @@ HMR イベントを購読します。 以下の HMR イベントは Vite によって自動的にディスパッチされます: - `'vite:beforeUpdate'` アップデートが適用される直前(例: モジュールが置き換えられるなど) +- `'vite:afterUpdate'` アップデートが適用された直後(例: モジュールが置き換えられるなど) - `'vite:beforeFullReload'` 完全なリロードが発生する直前 - `'vite:beforePrune'` もう必要なくなったモジュールが取り除かれる直前 - `'vite:invalidate'` モジュールが `import.meta.hot.invalidate()` で無効にされたとき - `'vite:error'` エラーが発生したとき(例: 構文エラーなど) +- `'vite:ws:disconnect'` WebSocket 接続が切断されたとき +- `'vite:ws:connect'` WebSocket 接続が(再)確立されたとき カスタム HMR イベントは、プラグインから送信することもできます。詳細は [handleHotUpdate](./api-plugin#handlehotupdate) を参照してください。 +## `hot.off(event, cb)` + +イベントリスナーからコールバックを削除します。 + ## `hot.send(event, data)` カスタムイベントを Vite の開発サーバーへ送信します。 -接続前に呼び出した場合、データはバッファされ、コネクションが確立した後に送信されます。 +接続前に呼び出した場合、データはバッファーされ、コネクションが確立した後に送信されます。 + +詳細は[カスタムイベント用の TypeScript](/guide/api-plugin.html#typescript-for-custom-events) セクションを含む[クライアントサーバーとの通信](/guide/api-plugin.html#client-server-communication)を参照してください。 + +## 参考資料 + +HMR API の使用方法や、内部でどのように機能するのかについて詳しく知りたい場合は、次の資料を参照してください: -詳細は [クライアントサーバーとの通信](/guide/api-plugin.html#client-server-communication) を参照してください。 +- [Hot Module Replacement is Easy](https://bjornlu.com/blog/hot-module-replacement-is-easy) diff --git a/guide/api-javascript.md b/guide/api-javascript.md index c883170a..90e6c288 100644 --- a/guide/api-javascript.md +++ b/guide/api-javascript.md @@ -4,7 +4,7 @@ Vite の JavaScript API は完全に型付けされているので、自動補 ## `createServer` -**型シグネチャ:** +**型シグネチャー:** ```ts async function createServer(inlineConfig?: InlineConfig): Promise @@ -12,41 +12,75 @@ async function createServer(inlineConfig?: InlineConfig): Promise **使用例:** -```js -import { fileURLToPath } from 'url' +```ts twoslash +import { fileURLToPath } from 'node:url' import { createServer } from 'vite' const __dirname = fileURLToPath(new URL('.', import.meta.url)) -;(async () => { - const server = await createServer({ - // 有効なユーザ設定オプションに `mode` と `configFile` を追加 - configFile: false, - root: __dirname, - server: { - port: 1337, +const server = await createServer({ + // 有効なユーザー設定オプションに `mode` と `configFile` を追加 + configFile: false, + root: __dirname, + server: { + port: 1337, + }, +}) +await server.listen() + +server.printUrls() +server.bindCLIShortcuts({ print: true }) +``` + +::: tip 注意 +同じ Node.js プロセス内で `createServer` と `build` を使用する場合、どちらの関数も `process.env.NODE_ENV` に依存して正しく動作しますが、これは `mode` 設定オプションに依存します。 矛盾した挙動にならないよう、`process.env.NODE_ENV` または 2 つの API の `mode` を `development` に設定します。もしくは、子プロセスを生成して、2 つの API を別々に実行することができます。 +::: + +::: tip 注意 +[ミドルウェアモード](/config/server-options.html#server-middlewaremode)と [WebSocket のプロキシ設定](/config/server-options.html#server-proxy)を組み合わせて使用する場合、プロキシを正しくバインドするには `middlewareMode` で親 http サーバーを指定する必要があります。 + +
+Example + +```ts twoslash +import http from 'http' +import { createServer } from 'vite' + +const parentServer = http.createServer() // もしくは express や koa など + +const vite = await createServer({ + server: { + // ミドルウェアモードを有効化 + middlewareMode: { + // プロキシ WebSocket 用の親 http サーバーを提供 + server: parentServer, + }, + proxy: { + '/ws': { + target: 'ws://localhost:3000', + // WebSocket をプロキシ + ws: true, + }, }, - }) - await server.listen() + }, +}) - server.printUrls() -})() +// @noErrors: 2339 +parentServer.use(vite.middlewares) ``` -::: tip 注意 -同じ Node.js プロセス内で `createServer` と `build` を使用する場合、どちらの関数も `process.env.``NODE_ENV` に依存して正しく動作しますが、これは `mode` 設定オプションに依存します。 矛盾した挙動にならないよう、`process.env.``NODE_ENV` または 2 つの API の `mode` を `development` に設定します。もしくは、子プロセスを生成して、2 つの API を別々に実行することができます。 +
::: ## `InlineConfig` -`InlineConfig` インタフェイスは、追加のプロパティで `UserConfig` を拡張します: +`InlineConfig` インターフェイスは、追加のプロパティで `UserConfig` を拡張します: - `configFile`: 使用する設定ファイルを指定します。設定されていない場合、Vite はプロジェクトルートからファイルを自動的に解決しようとします。自動解決を無効にするには `false` に設定します。 -- `envFile`: `.env` ファイルを無効にするには `false` に設定します。 ## `ResolvedConfig` -`ResolvedConfig` インタフェイスは、`UserConfig` の同一のすべてのプロパティを持ちます。ただし、ほとんどの値は解決済みで undefined ではありません。次のようなユーティリティも含んでいます: +`ResolvedConfig` インターフェイスは、`UserConfig` の同一のすべてのプロパティを持ちます。ただし、ほとんどの値は解決済みで undefined ではありません。次のようなユーティリティーも含んでいます: - `config.assetsInclude`: `id` がアセットとしてみなされるかどうかをチェックする関数。 - `config.logger`: Vite の内部的なロガーオブジェクト。 @@ -61,29 +95,30 @@ interface ViteDevServer { config: ResolvedConfig /** * 接続アプリのインスタンス - * - 開発サーバにカスタムミドルウェアを追加するために使用できます。 - * - カスタム HTTP サーバのハンドラ関数として、もしくは任意の接続スタイルの + * - 開発サーバーにカスタムミドルウェアを追加するために使用できます。 + * - カスタム HTTP サーバーのハンドラー関数として、もしくは任意の接続スタイルの * Node.js フレームワークのミドルウェアとして使用することもできます。 * * https://github.com/senchalabs/connect#use-middleware */ middlewares: Connect.Server /** - * ネイティブの Node HTTP サーバインスタンス。 + * ネイティブの Node HTTP サーバーインスタンス。 * ミドルウェアモードでは null になります。 */ httpServer: http.Server | null /** - * chokidar watcher のインスタンス。 - * https://github.com/paulmillr/chokidar#api + * chokidar watcher のインスタンス。`config.server.watch` が `null` に + * 設定されている場合、いかなるファイルも監視せず、`add` や `unwatch` を呼び出しても何も起こりません。 + * https://github.com/paulmillr/chokidar/tree/3.6.0#api */ watcher: FSWatcher /** - * `send(payload)` メソッドを持つ WebSocket サーバ。 + * `send(payload)` メソッドを持つ WebSocket サーバー。 */ ws: WebSocketServer /** - * 指定したファイル上でプラグインフックを実行できる Rollup プラグインコンテナ。 + * 指定したファイル上でプラグインフックを実行できる Rollup プラグインコンテナー。 */ pluginContainer: PluginContainer /** @@ -92,8 +127,8 @@ interface ViteDevServer { */ moduleGraph: ModuleGraph /** - * Vite が CLI に表示する解決済みの URL。ミドルウェアモードの場合や `server.listen` が - * 呼び出される前は null になります。 + * Vite が CLI に表示する解決済みの URL(URL エンコード済み)。ミドルウェアモードの場合、 + * またはサーバーがどのポートもリッスンしていない場合は、`null` を返します。 */ resolvedUrls: ResolvedServerUrls | null /** @@ -107,7 +142,11 @@ interface ViteDevServer { /** * Vite の組み込み HTML 変換と、プラグイン HTML 変換を適用します。 */ - transformIndexHtml(url: string, html: string): Promise + transformIndexHtml( + url: string, + html: string, + originalUrl?: string, + ): Promise /** * 指定された URL を SSR 用にインスタンス化されたモジュールとして読み込みます。 */ @@ -125,25 +164,41 @@ interface ViteDevServer { */ reloadModule(module: ModuleNode): Promise /** - * サーバを起動します。 + * サーバーを起動します。 */ listen(port?: number, isRestart?: boolean): Promise /** - * サーバを再起動します。 + * サーバーを再起動します。 * - * @param forceOptimize - オプティマイザに再バンドルを強制する。--force cliフラグと同じ + * @param forceOptimize - オプティマイザーに再バンドルを強制する。--force cli フラグと同じ */ restart(forceOptimize?: boolean): Promise /** - * サーバを停止します。 + * サーバーを停止します。 */ close(): Promise + /** + * CLI ショートカットをバインドします。 + */ + bindCLIShortcuts(options?: BindCLIShortcutsOptions): void + /** + * `await server.waitForRequestsIdle(id)` を呼ぶと、すべての静的インポートが処理されるまで待ちます。 + * load または transform プラグインフックから呼ばれた場合は、デッドロックを避けるために id を引数として + * 渡す必要があります。モジュールグラフの最初の静的インポートセクションが処理された後にこの関数を呼んだ場合、 + * 即座に解決されます。 + * @experimental + */ + waitForRequestsIdle: (ignoredId?: string) => Promise } ``` +:::info +`waitForRequestsIdle` は、Vite 開発サーバーのオンデマンドな性質に従うと実装できない機能の DX を改善するためのエスケープハッチとして使われることを目的としています。起動時に Tailwind などのツールで使用することで、アプリのコードが見えるようになるまでアプリの CSS クラスの生成を遅延させて、スタイル変更によるフラッシュを避けることができます。この関数が load または transform フック内で使用され、デフォルトの HTTP1 サーバーが使用された場合、6 つの HTTP チャンネルのうち 1 つは、サーバーがすべての静的インポートを処理するまでブロックされます。Vite の依存関係オプティマイザーは現在この関数を使用して、事前バンドルされた依存関係をすべてのインポートされた依存関係が静的インポートされたソースから収集されるまで遅延させることにより、見つからない依存関係上でのページ全体のリロードを防いでいます。Vite の将来のメジャーリリースでは、大規模なアプリケーションでコールドスタート中に性能低下を防ぐために、デフォルトで `optimizeDeps.crawlUntilStaticImports: false` に設定して、異なる戦略に切り替えるかもしれません。 +::: + ## `build` -**型シグネチャ:** +**型シグネチャー:** ```ts async function build( @@ -153,29 +208,27 @@ async function build( **使用例:** -```js -import path from 'path' -import { fileURLToPath } from 'url' +```js twoslash [vite.config.js] +import path from 'node:path' +import { fileURLToPath } from 'node:url' import { build } from 'vite' const __dirname = fileURLToPath(new URL('.', import.meta.url)) -;(async () => { - await build({ - root: path.resolve(__dirname, './project'), - base: '/foo/', - build: { - rollupOptions: { - // ... - }, +await build({ + root: path.resolve(__dirname, './project'), + base: '/foo/', + build: { + rollupOptions: { + // ... }, - }) -})() + }, +}) ``` ## `preview` -**型シグネチャ:** +**型シグネチャー:** ```ts async function preview(inlineConfig?: InlineConfig): Promise @@ -183,38 +236,77 @@ async function preview(inlineConfig?: InlineConfig): Promise **使用例:** -```js +```ts twoslash import { preview } from 'vite' -;(async () => { - const previewServer = await preview({ - // 有効なユーザ設定オプションに加え、`mode` と `configFile` - preview: { - port: 8080, - open: true, - }, - }) - previewServer.printUrls() -})() +const previewServer = await preview({ + // 有効なユーザー設定オプションに加え、`mode` と `configFile` + preview: { + port: 8080, + open: true, + }, +}) + +previewServer.printUrls() +previewServer.bindCLIShortcuts({ print: true }) +``` + +## `PreviewServer` + +```ts +interface PreviewServer { + /** + * 解決された vite config オブジェクト + */ + config: ResolvedConfig + /** + * connect アプリのインスタンス。 + * - プレビューサーバーにカスタムミドルウェアをアタッチするために使用できます。 + * - カスタム http サーバーのハンドラー関数として、もしくは connect スタイルの + * Node.js フレームワークのミドルウェアとしても使用可能 + * + * https://github.com/senchalabs/connect#use-middleware + */ + middlewares: Connect.Server + /** + * ネイティブの Node http サーバーインスタンス + */ + httpServer: http.Server + /** + * Vite が CLI に表示する解決済みの URL(URL エンコード済み)。 + * サーバーがどのポートもリッスンしていない場合は、`null` を返します。 + */ + resolvedUrls: ResolvedServerUrls | null + /** + * サーバーの URL を表示 + */ + printUrls(): void + /** + * CLI ショートカットをバインドする + */ + bindCLIShortcuts(options?: BindCLIShortcutsOptions): void +} ``` ## `resolveConfig` -**型シグネチャ:** +**型シグネチャー:** ```ts async function resolveConfig( inlineConfig: InlineConfig, command: 'build' | 'serve', defaultMode = 'development', + defaultNodeEnv = 'development', + isPreview = false, ): Promise ``` -`command` の値は、開発時(CLI で `vite`、`vite dev`、`vite serve` がエイリアス)は `serve` になります。 +`command` の値は dev と preview では `serve`、build では `build` になります。 ## `mergeConfig` -**型シグネチャ:** +**型シグネチャー:** ```ts function mergeConfig( @@ -226,9 +318,32 @@ function mergeConfig( 2 つの Vite の設定をディープマージします。`isRoot` はマージされる Vite の設定内の階層を表します。例えば、2 つの `build` オプションをマージする場合は `false` にします。 +::: tip 注意 +`mergeConfig` はオブジェクト形式の設定のみを受け付けます。コールバック形式の設定がある場合は、 `mergeConfig` に渡す前にコールバックを呼び出す必要があります。 + +`defineConfig` ヘルパーを使うと、コールバック形式の設定を別の設定にマージすることができます。 + +```ts twoslash +import { + defineConfig, + mergeConfig, + type UserConfigFnObject, + type UserConfig, +} from 'vite' +declare const configAsCallback: UserConfigFnObject +declare const configAsObject: UserConfig + +// ---cut--- +export default defineConfig((configEnv) => + mergeConfig(configAsCallback(configEnv), configAsObject), +) +``` + +::: + ## `searchForWorkspaceRoot` -**型シグネチャ:** +**型シグネチャー:** ```ts function searchForWorkspaceRoot( @@ -248,7 +363,7 @@ function searchForWorkspaceRoot( ## `loadEnv` -**型シグネチャ:** +**型シグネチャー:** ```ts function loadEnv( @@ -258,13 +373,13 @@ function loadEnv( ): Record ``` -**関連:** [`.env` Files](./env-and-mode.md#env-files) +**関連:** [`.env` ファイル](./env-and-mode.md#env-files) `envDir` 内の `.env` ファイルを読み込みます。デフォルトでは `prefixes` が変更されない限り、`VITE_` のプレフィックスのある環境変数のみが読み込まれます。 ## `normalizePath` -**型シグネチャ:** +**型シグネチャー:** ```ts function normalizePath(id: string): string @@ -276,7 +391,7 @@ Vite プラグイン間で相互運用するためにパスを正規化します ## `transformWithEsbuild` -**型シグネチャ:** +**型シグネチャー:** ```ts async function transformWithEsbuild( @@ -291,7 +406,7 @@ esbuild で JavaScript か TypeScript を変換します。Vite の内部での ## `loadConfigFromFile` -**型シグネチャ:** +**型シグネチャー:** ```ts async function loadConfigFromFile( @@ -299,6 +414,7 @@ async function loadConfigFromFile( configFile?: string, configRoot: string = process.cwd(), logLevel?: LogLevel, + customLogger?: Logger, ): Promise<{ path: string config: UserConfig @@ -307,3 +423,30 @@ async function loadConfigFromFile( ``` esbuild で Vite の設定ファイルを手動で読み込みます。 + +## `preprocessCSS` + +- **実験的機能:** [フィードバックをしてください](https://github.com/vitejs/vite/discussions/13815) + +**型シグネチャー:** + +```ts +async function preprocessCSS( + code: string, + filename: string, + config: ResolvedConfig, +): Promise + +interface PreprocessCSSResult { + code: string + map?: SourceMapInput + modules?: Record + deps?: Set +} +``` + +`.css`、`.scss`、`.sass`、`.less`、`.styl`、および `.stylus` ファイルをプリプロセスし、プレーンな CSS に変換することで、プラウザーで使用したり、他のツールでパースできるようにします。[ビルトインの CSS プリプロセスのサポート](/guide/features#css-pre-processors)と同様に、使用する場合には対応するプリプロセッサーをインストールする必要があります。 + +使用するプリプロセッサーは、`filename` の拡張子から推定されます。`filename` の最後が `.module.{ext}` で終わる場合、[CSS module](https://github.com/css-modules/css-modules) として推定され、返される結果には、元のクラス名を変換後のクラス名にマッピングする `modules` オブジェクトが含まれます。 + +プリプロセスは、`url()` や `image-set()` 内の URL を解決しないことに注意してください。 diff --git a/guide/api-plugin.md b/guide/api-plugin.md index 52604fae..87a532cc 100644 --- a/guide/api-plugin.md +++ b/guide/api-plugin.md @@ -1,23 +1,23 @@ # プラグイン API -Vite プラグインは、Rollup の優れた設計のプラグインインターフェースを Vite 特有のオプションで拡張しています。その結果、Vite プラグインを一度作成すれば、開発とビルドの両方で動作させることができます。 +Vite プラグインは、Rollup の優れた設計のプラグインインターフェイスを Vite 特有のオプションで拡張しています。その結果、Vite プラグインを一度作成すれば、開発とビルドの両方で動作させることができます。 -**以下のセクションを読む前に、まず [Rollup のプラグインドキュメント](https://rollupjs.org/guide/en/#plugin-development)を読むことをお勧めします。** +**以下のセクションを読む前に、まず [Rollup のプラグインドキュメント](https://rollupjs.org/plugin-development/)を読むことをお勧めします。** ## プラグインの作成 -Vite は、確立されたパターンをすぐに提供できるように努めているため、新しいプラグインを作成する前に、[機能ガイド](https://vitejs.dev/guide/features)をチェックして、ニーズが満たされているかどうかを確認してください。また、[互換性のある Rollup プラグイン](https://github.com/rollup/awesome)と [Vite 固有のプラグイン](https://github.com/vitejs/awesome-vite#plugins)の両方の形式で、利用可能なコミュニティプラグインを確認してください。 +Vite は、確立されたパターンをすぐに提供できるように努めているため、新しいプラグインを作成する前に、[機能ガイド](/guide/features)をチェックして、ニーズが満たされているかどうかを確認してください。また、[互換性のある Rollup プラグイン](https://github.com/rollup/awesome)と [Vite 固有のプラグイン](https://github.com/vitejs/awesome-vite#plugins)の両方の形式で、利用可能なコミュニティープラグインを確認してください。 -プラグインを作成する際には、`vite.config.js` にインラインで記述できます。そのために新しいパッケージを作成する必要はありません。あるプラグインが自分のプロジェクトで役に立ったことがわかったら、[エコシステムにいる](https://chat.vitejs.dev)他の人を助けるために共有することを検討してください。 +プラグインを作成する際には、`vite.config.js` にインラインで記述できます。そのために新しいパッケージを作成する必要はありません。あるプラグインが自分のプロジェクトで役に立ったことがわかったら、[エコシステムにいる](https://chat.vite.dev)他の人を助けるために共有することを検討してください。 ::: tip プラグインを学んだり、デバッグしたり、作成したりする際には、 [vite-plugin-inspect](https://github.com/antfu/vite-plugin-inspect) をプロジェクトに含めることをお勧めします。これにより、Vite プラグインの中間状態を検査できます。インストール後、`localhost:5173/__inspect/` にアクセスして、プロジェクトのモジュールや変換スタックを検査できます。インストール方法については、[vite-plugin-inspect のドキュメント](https://github.com/antfu/vite-plugin-inspect)をご覧ください。 -![vite-plugin-inspect](/images/vite-plugin-inspect.png) +![vite-plugin-inspect](../images/vite-plugin-inspect.webp) ::: ## 規約 -プラグインが Vite 特有のフックを使用せず、[Rollup 互換のプラグイン](#rollup-プラグインの互換性)として実装できる場合は、[Rollup プラグインの命名規則](https://rollupjs.org/guide/en/#conventions)を使用することをお勧めします。 +プラグインが Vite 特有のフックを使用せず、[Rollup 互換のプラグイン](#rollup-plugin-compatibility)として実装できる場合は、[Rollup プラグインの命名規則](https://rollupjs.org/plugin-development/#conventions)を使用することをお勧めします。 - Rollup プラグインは、`rollup-plugin-` のプレフィックスが付いた明確な名前を持つ必要があります。 - package.json に `rollup-plugin` および `vite-plugin` キーワードを含めます。 @@ -36,14 +36,13 @@ Vite 専用プラグインの場合 - React プラグインには `vite-plugin-react-` のプレフィックス - Svelte プラグインには `vite-plugin-svelte-` のプレフィックス -[仮想モジュールの規約](#仮想モジュールの規約)も参照してください。 +[仮想モジュールの規約](#virtual-modules-convention)も参照してください。 ## プラグインの設定 -ユーザはプロジェクトの `devDependencies` にプラグインを追加し、 `plugins` 配列のオプションを使って設定します。 +ユーザーはプロジェクトの `devDependencies` にプラグインを追加し、 `plugins` 配列のオプションを使って設定します。 -```js -// vite.config.js +```js [vite.config.js] import vitePlugin from 'vite-plugin-feature' import rollupPlugin from 'rollup-plugin-feature' @@ -66,8 +65,7 @@ export default function framework(config) { } ``` -```js -// vite.config.js +```js [vite.config.js] import { defineConfig } from 'vite' import framework from 'vite-plugin-framework' @@ -79,7 +77,7 @@ export default defineConfig({ ## シンプルな例 :::tip -Vite/Rollup プラグインは、実際のプラグインオブジェクトを返すファクトリ関数として作成するのが一般的です。この関数はユーザがプラグインの動作をカスタマイズするためのオプションを受け付けます。 +Vite/Rollup プラグインは、実際のプラグインオブジェクトを返すファクトリー関数として作成するのが一般的です。この関数はユーザーがプラグインの動作をカスタマイズするためのオプションを受け付けます。 ::: ### カスタムファイルタイプの変換 @@ -105,9 +103,9 @@ export default function myPlugin() { ### 仮想ファイルのインポート -[次のセクション](#仮想モジュールの規約)の例を参照してください。 +[次のセクション](#virtual-modules-convention)の例を参照してください。 -## 仮想モジュールの規約 +## 仮想モジュールの規約 {#virtual-modules-convention} 仮想モジュールは、通常の ESM インポート構文を使用して、ビルド時の情報をソースファイルに渡すことができる便利な機構です。 @@ -140,33 +138,37 @@ import { msg } from 'virtual:my-module' console.log(msg) ``` -Vite (および Rollup) の仮想モジュールは慣例により、ユーザー向けのパスの先頭に `virtual:` を付けます。エコシステム内の他のプラグインとの衝突を避けるために、可能であればプラグイン名を名前空間として使用すべきです。例えば、`vite-plugin-posts` は、ビルド時間の情報を得るために `virtual:posts` や `virtual:posts/helpers` といった仮想モジュールをインポートするようユーザーに求めることができます。内部的には、Rollup エコシステムの慣例として、仮想モジュールを使用するプラグインは、ID を解決する際にモジュール ID の前に `\0` を付ける必要があります。これにより、他のプラグインが ID を処理しようとするのを防ぎ(ノード解決など)、ソースマップなどのコア機能がこの情報を使用して、仮想モジュールと通常のファイルを区別できます。`\0` はインポート URL で許可されていない文字なので、インポート分析中に置き換える必要があります。`\0{id}` の仮想 ID は、ブラウザでの開発中に `/@id/__x00__{id}` としてエンコードされてしまいます。ID はプラグインパイプラインに入る前にデコードされて戻ってくるので、これはプラグインフックコードには表示されません。 +Vite(および Rollup)の仮想モジュールは慣例により、ユーザー向けのパスの先頭に `virtual:` を付けます。エコシステム内の他のプラグインとの衝突を避けるために、可能であればプラグイン名を名前空間として使用すべきです。例えば、`vite-plugin-posts` は、ビルド時間の情報を得るために `virtual:posts` や `virtual:posts/helpers` といった仮想モジュールをインポートするようユーザーに求めることができます。内部的には、Rollup エコシステムの慣例として、仮想モジュールを使用するプラグインは、ID を解決する際にモジュール ID の前に `\0` を付ける必要があります。これにより、他のプラグインが ID を処理しようとするのを防ぎ(ノード解決など)、ソースマップなどのコア機能がこの情報を使用して、仮想モジュールと通常のファイルを区別できます。`\0` はインポート URL で許可されていない文字なので、インポート分析中に置き換える必要があります。`\0{id}` の仮想 ID は、ブラウザーでの開発中に `/@id/__x00__{id}` としてエンコードされてしまいます。ID はプラグインパイプラインに入る前にデコードされて戻ってくるので、これはプラグインフックコードには表示されません。 なお、単一ファイルコンポーネント(.vue や .svelte など。SFC)のスクリプトモジュールのように、実際のファイルから直接派生したモジュールは、この規約に従う必要はありません。SFC では通常、処理時に一連のサブモジュールが生成されますが、これらのコードはファイルシステムにマップして戻せます。これらのサブモジュールに `\0` を使用すると、ソースマップが正しく機能しなくなります。 ## 共通のフック -開発中、Vite 開発サーバは、Rollup が行うのと同じ方法で [Rollup ビルドフック](https://rollupjs.org/guide/en/#build-hooks)を呼び出すプラグインコンテナを作成します。 +開発中、Vite 開発サーバーは、Rollup が行うのと同じ方法で [Rollup ビルドフック](https://rollupjs.org/plugin-development/#build-hooks)を呼び出すプラグインコンテナーを作成します。 -以下のフックはサーバ起動時に一度だけ呼び出されます: +以下のフックはサーバー起動時に一度だけ呼び出されます: -- [`options`](https://rollupjs.org/guide/en/#options) -- [`buildStart`](https://rollupjs.org/guide/en/#buildstart) +- [`options`](https://rollupjs.org/plugin-development/#options) +- [`buildStart`](https://rollupjs.org/plugin-development/#buildstart) 以下のフックはモジュールのリクエストが来るたびに呼び出されます: -- [`resolveId`](https://rollupjs.org/guide/en/#resolveid) -- [`load`](https://rollupjs.org/guide/en/#load) -- [`transform`](https://rollupjs.org/guide/en/#transform) +- [`resolveId`](https://rollupjs.org/plugin-development/#resolveid) +- [`load`](https://rollupjs.org/plugin-development/#load) +- [`transform`](https://rollupjs.org/plugin-development/#transform) + +また、これらのフックは Vite 固有のプロパティを追加した拡張 `options` パラメーターを持ちます。詳しくは [SSR ドキュメント](/guide/ssr#ssr-specific-plugin-logic)に書かれています。 + +Vite によるバンドルされていない開発サーバーパターンにより、実際のインポーターを導き出すことができない場合があるため、一部の `resolveId` 呼び出しの `importer` 値はルートにある一般的な `index.html` の絶対パスであるかもしれません。Vite の resolve pipeline 内で処理されるインポートについては、インポートの解析段階でインポーターを追跡して、正しい `importer` 値を提供することができます。 -以下のフックはサーバが閉じられる時に呼び出されます: +以下のフックはサーバーが閉じられる時に呼び出されます: -- [`buildEnd`](https://rollupjs.org/guide/en/#buildend) -- [`closeBundle`](https://rollupjs.org/guide/en/#closebundle) +- [`buildEnd`](https://rollupjs.org/plugin-development/#buildend) +- [`closeBundle`](https://rollupjs.org/plugin-development/#closebundle) -Vite はパフォーマンスを向上させるために完全な AST のパースを避けるので、[`moduleParsed`](https://rollupjs.org/guide/en/#moduleparsed) フックは開発中には**呼び出されない**ことに注意してください。 +Vite はパフォーマンスを向上させるために完全な AST のパースを避けるので、[`moduleParsed`](https://rollupjs.org/plugin-development/#moduleparsed) フックは開発中には**呼び出されない**ことに注意してください。 -[出力生成フック](https://rollupjs.org/guide/en/#output-generation-hooks)(`closeBundle` を除く)は開発中には**呼び出されません**。Vite の開発サーバは `bundle.generate()` を呼び出さず、`rollup.rollup()` だけを呼び出していると考えることができます。 +[出力生成フック](https://rollupjs.org/plugin-development/#output-generation-hooks)(`closeBundle` を除く)は開発中には**呼び出されません**。Vite の開発サーバーは `bundle.generate()` を呼び出さず、`rollup.rollup()` だけを呼び出していると考えることができます。 ## Vite 特有のフック @@ -177,7 +179,7 @@ Vite プラグインは Vite 特有の目的を果たすフックを提供する - **型:** `(config: UserConfig, env: { mode: string, command: string }) => UserConfig | null | void` - **種類:** `async`, `sequential` - Vite の設定を解決される前に変更します。このフックは生のユーザ設定(CLI オプションが設定ファイルにマージされたもの)と使用されている `mode` と `command` を公開する現在の設定環境を受け取ります。既存の設定に深くマージされる部分的な設定オブジェクトを返したり、設定を直接変更できます(デフォルトのマージで目的の結果が得られない場合)。 + Vite の設定を解決される前に変更します。このフックは生のユーザー設定(CLI オプションが設定ファイルにマージされたもの)と使用されている `mode` と `command` を公開する現在の設定環境を受け取ります。既存の設定に深くマージされる部分的な設定オブジェクトを返したり、設定を直接変更できます(デフォルトのマージで目的の結果が得られない場合)。 **例:** @@ -206,7 +208,7 @@ Vite プラグインは Vite 特有の目的を果たすフックを提供する ``` ::: warning 注意 - ユーザプラグインはこのフックを実行する前に解決されるので、`config` フックの中に他のプラグインを注入しても効果はありません。 + ユーザープラグインはこのフックを実行する前に解決されるので、`config` フックの中に他のプラグインを注入しても効果はありません。 ::: ### `configResolved` @@ -233,7 +235,7 @@ Vite プラグインは Vite 特有の目的を果たすフックを提供する // 保存された設定を他のフックで使用 transform(code, id) { if (config.command === 'serve') { - // dev: 開発サーバから呼び出されるプラグイン + // dev: 開発サーバーから呼び出されるプラグイン } else { // build: Rollup から呼び出されるプラグイン } @@ -248,9 +250,9 @@ Vite プラグインは Vite 特有の目的を果たすフックを提供する - **型:** `(server: ViteDevServer) => (() => void) | void | Promise<(() => void) | void>` - **種類:** `async`, `sequential` -- **参考:** [ViteDevServer](./api-javascript#vitedevserver) +- **参照:** [ViteDevServer](./api-javascript#vitedevserver) - 開発サーバを設定するためのフック。内部の [connect](https://github.com/senchalabs/connect) アプリにカスタムミドルウェアを追加するのが最も一般的な使用例です: + 開発サーバーを設定するためのフック。内部の [connect](https://github.com/senchalabs/connect) アプリにカスタムミドルウェアを追加するのが最も一般的な使用例です: ```js const myPlugin = () => ({ @@ -282,9 +284,9 @@ Vite プラグインは Vite 特有の目的を果たすフックを提供する }) ``` - **サーバアクセスの保存** + **サーバーアクセスの保存** - 場合によっては、他のプラグインフックが開発サーバのインスタンスへのアクセスを必要とすることがあります(たとえば、Web ソケットサーバ、ファイルシステムウォッチャ、モジュールグラフへのアクセス)。このフックは他のフックでアクセスするためにサーバインスタンスを保存するためにも使用できます: + 場合によっては、他のプラグインフックが開発サーバーのインスタンスへのアクセスを必要とすることがあります(たとえば、WebSocket サーバー、ファイルシステムウォッチャー、モジュールグラフへのアクセス)。このフックは他のフックでアクセスするためにサーバーインスタンスを保存するためにも使用できます: ```js const myPlugin = () => { @@ -296,7 +298,7 @@ Vite プラグインは Vite 特有の目的を果たすフックを提供する }, transform(code, id) { if (server) { - // サーバを使用... + // サーバーを使用... } }, } @@ -307,10 +309,11 @@ Vite プラグインは Vite 特有の目的を果たすフックを提供する ### `configurePreviewServer` -- **型:** `(server: { middlewares: Connect.Server, httpServer: http.Server }) => (() => void) | void | Promise<(() => void) | void>` +- **型:** `(server: PreviewServer) => (() => void) | void | Promise<(() => void) | void>` - **種類:** `async`, `sequential` +- **参照:** [PreviewServer](./api-javascript#previewserver) - [`configureServer`](/guide/api-plugin.html#configureserver) と同じですがプレビューサーバ用です。[connect](https://github.com/senchalabs/connect) サーバとその配下にある [http server](https://nodejs.org/api/http.html) を提供します。`configureServer` と同様に、`configurePreviewServer` フックは他のミドルウェアがインストールされる前に呼び出されます。他のミドルウェアをインストールした**後に**ミドルウェアをインジェクトしたい場合は、`configurePreviewServer` から関数を返すことで、内部のミドルウェアがインストールされた後に呼び出されるようにすることができます: + [`configureServer`](/guide/api-plugin.html#configureserver) と同じですがプレビューサーバー用です。`configureServer` と同様に、`configurePreviewServer` フックは他のミドルウェアがインストールされる前に呼び出されます。他のミドルウェアをインストールした**後に**ミドルウェアをインジェクトしたい場合は、`configurePreviewServer` から関数を返すことで、内部のミドルウェアがインストールされた後に呼び出されるようにすることができます: ```js const myPlugin = () => ({ @@ -335,11 +338,12 @@ Vite プラグインは Vite 特有の目的を果たすフックを提供する `index.html` などの HTML エントリーポイントファイルを変換するための専用フック。このフックは現在の HTML 文字列と変換コンテキストを受け取ります。コンテキストは開発時には [`ViteDevServer`](./api-javascript#vitedevserver) を公開し、ビルド時には Rollup の出力バンドルを公開します。 このフックは非同期にすることも可能で、次のいずれかを返すことができます: - - 変換された HTML 文字列 - 既存の HTML に注入するタグ記述子オブジェクト(`{ tag, attrs, children }`)の配列。各タグは注入箇所を指定できます(デフォルトでは `` の前) - 両方を含むオブジェクト `{ html, tags }` + デフォルトでは `order` は `undefined` で、このフックは HTML が変換された後に適用されます。Vite プラグインのパイプラインを通るべきスクリプトを挿入するためには、`order: 'pre'` を指定すると HTML を処理する前にフックが適用されます。`order: 'post'` は、`order` が未定義であるフックがすべて適用された後にフックを適用します。 + **基本的な例:** ```js @@ -356,7 +360,7 @@ Vite プラグインは Vite 特有の目的を果たすフックを提供する } ``` - **フックの完全なシグネチャ:** + **フックの完全なシグネチャー:** ```ts type IndexHtmlTransformHook = ( @@ -392,11 +396,17 @@ Vite プラグインは Vite 特有の目的を果たすフックを提供する } ``` +::: warning 注意 +エントリーファイルのカスタム処理があるフレームワークを使用している場合、このフックは呼ばれません(たとえば、[SvelteKit](https://github.com/sveltejs/kit/discussions/8269#discussioncomment-4509145))。 +::: + ### `handleHotUpdate` - **型:** `(ctx: HmrContext) => Array | void | Promise | void>` +- **種類:** `async`、`sequential` +- **参照:** [HMR API](./api-hmr) - カスタム HMR 更新処理を実行します。このフックは以下のシグネチャのコンテキストオブジェクトを受け取ります: + カスタム HMR 更新処理を実行します。このフックは以下のシグネチャーのコンテキストオブジェクトを受け取ります: ```ts interface HmrContext { @@ -413,8 +423,26 @@ Vite プラグインは Vite 特有の目的を果たすフックを提供する - `read` はファイルの内容を返す非同期の read 関数です。システムによってはファイル変更コールバックがエディタのファイル更新完了前に発生してしまい、`fs.readFile` が空の内容を返すため、この関数が提供されています。渡される read 関数は、この動作を正規化します。 このフックは以下を選択できます: + - 影響を受けるモジュールをフィルターして絞り込むことで、HMR がより正確になります。 - - 影響を受けるモジュールをフィルタして絞り込むことで、HMR がより正確になります。 + - 空の配列を返し、完全なリロードを実行します: + + ```js + handleHotUpdate({ server, modules, timestamp }) { + // Invalidate modules manually + const invalidatedModules = new Set() + for (const mod of modules) { + server.moduleGraph.invalidateModule( + mod, + invalidatedModules, + timestamp, + true + ) + } + server.ws.send({ type: 'full-reload' }) + return [] + } + ``` - 空の配列を返し、クライアントにカスタムイベントを送信して、完全なカスタム HMR 処理を実行します: @@ -429,7 +457,7 @@ Vite プラグインは Vite 特有の目的を果たすフックを提供する } ``` - クライアントコードは [HMR API](./api-hmr) を使用して対応するハンドラを登録する必要があります(これは同じプラグインの `transform` フックによって注入される可能性があります): + クライアントコードは [HMR API](./api-hmr) を使用して対応するハンドラーを登録する必要があります(これは同じプラグインの `transform` フックによって注入される可能性があります): ```js if (import.meta.hot) { @@ -439,17 +467,19 @@ Vite プラグインは Vite 特有の目的を果たすフックを提供する } ``` -## プラグインの順序 +## プラグインの順序 {#plugin-ordering} Vite プラグインは、さらに(webpack loader と同様の)`enforce` プロパティを指定して、適用の順序を調整できます。`enforce` の値は `"pre"` か `"post"` のいずれかです。解決されたプラグインは、以下の順序になります: - エイリアス -- `enforce: 'pre'` を指定したユーザプラグイン +- `enforce: 'pre'` を指定したユーザープラグイン - Vite のコアプラグイン -- enforce の値がないユーザプラグイン +- enforce の値がないユーザープラグイン - Vite のビルドプラグイン -- `enforce: 'post'` を指定したユーザプラグイン -- Vite ポストビルドプラグイン (minify, manifest, reporting) +- `enforce: 'post'` を指定したユーザープラグイン +- Vite ポストビルドプラグイン(minify, manifest, reporting) + +これはフックの並び順とは別のものであることに注意してください。フックの並び順は [Rollup フックと同様](https://rollupjs.org/plugin-development/#build-hooks)、`order` 属性に従います。 ## 条件付きの適用 @@ -473,21 +503,20 @@ apply(config, { command }) { } ``` -## Rollup プラグインの互換性 +## Rollup プラグインの互換性 {#rollup-plugin-compatibility} -かなりの数の Rollup プラグインが Vite プラグインとして直接動作します(例: `@rollup/plugin-alias` や `@rollup/plugin-json` など)が、すべてではありません。一部のプラグインフックは、バンドルされていない開発サーバのコンテキストでは意味をなさないためです。 +かなりの数の Rollup プラグインが Vite プラグインとして直接動作します(例: `@rollup/plugin-alias` や `@rollup/plugin-json` など)が、すべてではありません。一部のプラグインフックは、バンドルされていない開発サーバーのコンテキストでは意味をなさないためです。 一般的に、Rollup プラグインが以下の基準に適合する限り、Vite プラグインとして動作するでしょう: -- [`moduleParsed`](https://rollupjs.org/guide/en/#moduleparsed) フックを使用していない。 +- [`moduleParsed`](https://rollupjs.org/plugin-development/#moduleparsed) フックを使用していない。 - bundle-phase フックと output-phase フックの間に強い結合がない。 Rollup プラグインがビルドフェーズでのみ意味を持つ場合は、代わりに `build.rollupOptions.plugins` で指定できます。これは `enforce: 'post'` と `apply: 'build'` を設定した Vite プラグインと同じように動作します。 Vite のみのプロパティで既存の Rollup プラグインを拡張することもできます: -```js -// vite.config.js +```js [vite.config.js] import example from 'rollup-plugin-example' import { defineConfig } from 'vite' @@ -502,13 +531,11 @@ export default defineConfig({ }) ``` -[Vite Rollup Plugins](https://vite-rollup-plugins.patak.dev) では、互換性のある公式 Rollup プラグインのリストと使用方法を確認できます。 - ## パスの正規化 -Vite は、Windows ではボリュームを維持しつつ、POSIX セパレータ ( / ) を使用して ID を解決しながらパスを正規化します。一方で、Rollup はデフォルトでは解決されたパスをそのままにするので、Windows では解決された ID は win32 セパレータ ( \\ ) を持つことになります。ただし、Rollup プラグインは `@rollup/pluginutils` の [`normalizePath` ユーティリティ関数](https://github.com/rollup/plugins/tree/master/packages/pluginutils#normalizepath)を内部で使用しており、比較を行う前にセパレータを POSIX に変換しています。これは、これらのプラグインが Vite で使用されている場合、解決された ID の比較に対する `include` と `exclude` の設定パターンやその他の同様のパスが正しく動作することを意味します。 +Vite は、Windows ではボリュームを維持しつつ、POSIX セパレーター(/)を使用して ID を解決しながらパスを正規化します。一方で、Rollup はデフォルトでは解決されたパスをそのままにするので、Windows では解決された ID は win32 セパレーター(\\)を持つことになります。ただし、Rollup プラグインは `@rollup/pluginutils` の [`normalizePath` ユーティリティー関数](https://github.com/rollup/plugins/tree/master/packages/pluginutils#normalizepath)を内部で使用しており、比較を行う前にセパレーターを POSIX に変換しています。これは、これらのプラグインが Vite で使用されている場合、解決された ID の比較に対する `include` と `exclude` の設定パターンやその他の同様のパスが正しく動作することを意味します。 -したがって、Vite プラグインでは、解決された ID に対するパスを比較する際、最初に POSIX セパレータを使用するようにパスを正規化することが重要です。同等の `normalizePath` ユーティリティ関数が `vite` モジュールからエクスポートされます。 +したがって、Vite プラグインでは、解決された ID に対するパスを比較する際、最初に POSIX セパレーターを使用するようにパスを正規化することが重要です。同等の `normalizePath` ユーティリティー関数が `vite` モジュールからエクスポートされます。 ```js import { normalizePath } from 'vite' @@ -521,22 +548,58 @@ normalizePath('foo/bar') // 'foo/bar' Vite は [`@rollup/pluginutils` の `createFilter`](https://github.com/rollup/plugins/tree/master/packages/pluginutils#createfilter) 関数を公開し、Vite 固有のプラグインやインテグレーションが標準の include/exclude フィルタリングのパターンを使用できるようにします。これは Vite コア自体でも使用されています。 -## クライアントサーバーとの通信 +### フックフィルター {#hook-filters} + +Rolldown は[フックフィルター機能](https://rolldown.rs/plugins/hook-filters)を導入して、Rust と JavaScript のランタイムの間の通信オーバーヘッドを削減しました。この機能により、プラグインはフックを呼び出すタイミングを決定するパターンを指定でき、不要なフック呼び出しを回避することでパフォーマンスを向上させます。 + +これは Rollup 4.38.0+ および Vite 6.3.0+ でもサポートされています。プラグインを古いバージョンとの後方互換性を持たせるには、フックハンドラー内でもフィルターを実行するようにしてください。 + +```js +export default function myPlugin() { + const jsFileRegex = /\.js$/ + + return { + name: 'my-plugin', + // 例: .js ファイルに対してのみ transform を呼び出す + transform: { + filter: { + id: jsFileRegex, + }, + handler(code, id) { + // 後方互換性のための追加チェック + if (!jsFileRegex.test(id)) return null + + return { + code: transformCode(code), + map: null, + } + }, + }, + } +} +``` + +::: tip +[`@rolldown/pluginutils`](https://www.npmjs.com/package/@rolldown/pluginutils) は、`exactRegex` や `prefixRegex` のようなフックフィルター用のいくつかのユーティリティーをエクスポートしています。 +::: + +## クライアントサーバーとの通信 {#client-server-communication} Vite の 2.9 から、プラグインによりクライアントとの通信に役立つ機能をいくつか提供しています。 ### サーバーからクライアントへ -プラグイン側からは `server.ws.send` を使うことで全クライアントへイベントを配信することができます: +プラグイン側からは `server.ws.send` を使うことでクライアントへイベントを配信できます: -```js -// vite.config.js +```js [vite.config.js] export default defineConfig({ plugins: [ { // ... configureServer(server) { - server.ws.send('my:greetings', { msg: 'hello' }) + server.ws.on('connection', () => { + server.ws.send('my:greetings', { msg: 'hello' }) + }) }, }, ], @@ -549,7 +612,9 @@ export default defineConfig({ クライアント側では、[`hot.on`](/guide/api-hmr.html#hot-on-event-cb) を使用してイベントをリッスンします: -```ts +```ts twoslash +import 'vite/client' +// ---cut--- // クライアント側 if (import.meta.hot) { import.meta.hot.on('my:greetings', (data) => { @@ -560,7 +625,7 @@ if (import.meta.hot) { ### クライアントからサーバーへ -クライアントからサーバーへイベント送信する時 [`hot.send`](/guide/api-hmr.html#hot-send-event-payload) を使うことができます: +クライアントからサーバーへイベント送信する時 [`hot.send`](/guide/api-hmr.html#hot-send-event-data) を使うことができます: ```ts // クライアント側 @@ -571,8 +636,7 @@ if (import.meta.hot) { この時、サーバー側では `server.ws.on` を使ってイベントをリッスンします: -```js -// vite.config.js +```js [vite.config.js] export default defineConfig({ plugins: [ { @@ -580,7 +644,7 @@ export default defineConfig({ configureServer(server) { server.ws.on('my:from-client', (data, client) => { console.log('Message from client:', data.msg) // Hey! - // クライアントへの返信のみ (必要であれば) + // クライアントへの返信のみ(必要であれば) client.send('my:ack', { msg: 'Hi! I got your message!' }) }) }, @@ -589,18 +653,41 @@ export default defineConfig({ }) ``` -### カスタムイベント用の TypeScript +### カスタムイベント用の TypeScript {#typescript-for-custom-events} -`CustomEventMap` インタフェイスを拡張することで、カスタムイベントに型をつけられます: +内部では、Vite はペイロードの型を `CustomEventMap` インターフェイスから推論しますが、インターフェイスを拡張することでカスタムイベントを型付けすることも可能です。 -```ts -// events.d.ts -import 'vite/types/customEvent' +:::tip 注意 +TypeScript の型宣言ファイルを指定する際は `.d.ts` 拡張子を含めてください。そうしなければ、TypeScript はモジュールがどのファイルを拡張しようとしているのかを認識できない可能性があります。 +::: + +```ts [events.d.ts] +import 'vite/types/customEvent.d.ts' -declare module 'vite/types/customEvent' { +declare module 'vite/types/customEvent.d.ts' { interface CustomEventMap { 'custom:foo': { msg: string } // 'event-key': payload } } ``` + +このインターフェイス拡張は、イベント `T` に対するペイロードの型を推論するために `InferCustomEventPayload` により使用されます。このインターフェイスの使用に関する詳しい情報については、[HMR API のドキュメント](./api-hmr#hmr-api)を参照してください。 + +```ts twoslash +import 'vite/client' +import type { InferCustomEventPayload } from 'vite/types/customEvent.d.ts' +declare module 'vite/types/customEvent.d.ts' { + interface CustomEventMap { + 'custom:foo': { msg: string } + } +} +// ---cut--- +type CustomFooPayload = InferCustomEventPayload<'custom:foo'> +import.meta.hot?.on('custom:foo', (payload) => { + // ペイロードの型は { msg: string } になります +}) +import.meta.hot?.on('unknown:event', (payload) => { + // ペイロードの型は any になります +}) +``` diff --git a/guide/assets.md b/guide/assets.md index 5faff4b1..8e4b20f5 100644 --- a/guide/assets.md +++ b/guide/assets.md @@ -7,12 +7,14 @@ 静的アセットをインポートすると、配信された際に解決されたパブリックな URL が返されます: -```js +```js twoslash +import 'vite/client' +// ---cut--- import imgUrl from './img.png' document.getElementById('hero-img').src = imgUrl ``` -例えば、 `imgUrl` は、開発中は `/img.png` となり、本番用ビルドでは `/assets/img.2d8efhg.png` となります。 +例えば、 `imgUrl` は、開発中は `/src/img.png` となり、本番用ビルドでは `/assets/img.2d8efhg.png` となります。 振る舞いは webpack の `file-loader` に似ています。異なるのは、絶対的なパブリックパス(開発中のプロジェクトのルートに基づく)または、相対パスを使用することができるという点です。 @@ -26,24 +28,51 @@ document.getElementById('hero-img').src = imgUrl - [`assetsInlineLimit` オプション](/config/build-options.md#build-assetsinlinelimit) で指定したバイト数よりも小さいアセットは base64 データの URL としてインライン化されます -- Git LFS のプレースホルダは、それが表すファイルの内容を含んでいないため、自動的にインライン化の対象から除外されます。インライン化するには、ビルドする前に必ずファイルの内容を Git LFS 経由でダウンロードするようにしてください。 +- Git LFS のプレースホルダーは、それが表すファイルの内容を含んでいないため、自動的にインライン化の対象から除外されます。インライン化するには、ビルドする前に必ずファイルの内容を Git LFS 経由でダウンロードするようにしてください。 -- TypeScript はデフォルトでは静的アセットのインポートを有効なモジュールとして認識しません。これを修正するには、[`vite/client`](./features#クライアントでの型)を追加します。 +- TypeScript はデフォルトでは静的アセットのインポートを有効なモジュールとして認識しません。これを修正するには、[`vite/client`](./features#client-types)を追加します。 -### 明示的な URL のインポート +::: tip `url()` を用いた SVG のインライン化 +SVG の URL を JS により手動で構築した `url()` に渡すときには、変数をダブルクオートで囲む必要があります。 -内部リストや `assetsInclude` に含まれていないアセットは URL の末尾に `?url` を付与することで明示的にインポートすることができます。これは、例えば [Houdini Paint Worklets](https://houdini.how/usage) をインポートするときに便利です。 +```js twoslash +import 'vite/client' +// ---cut--- +import imgUrl from './img.svg' +document.getElementById('hero-img').style.background = `url("${imgUrl}")` +``` -```js +::: + +### 明示的な URL のインポート {#explicit-url-imports} + +内部リストや `assetsInclude` に含まれていないアセットは URL の末尾に `?url` を付与することで明示的にインポートできます。これは、例えば [Houdini Paint Worklets](https://developer.mozilla.org/ja/docs/Web/API/CSS/paintWorklet_static) をインポートするときに便利です。 + +```js twoslash +import 'vite/client' +// ---cut--- import workletURL from 'extra-scalloped-border/worklet.js?url' CSS.paintWorklet.addModule(workletURL) ``` -### アセットを文字列としてインポートする +### 明示的なインライン処理 + +アセットは、`?inline` または `?no-inline` 接尾辞を使用することで、それぞれインラインまたは非インラインで明示的にインポートできます。 + +```js twoslash +import 'vite/client' +// ---cut--- +import imgUrl1 from './img.svg?no-inline' +import imgUrl2 from './img.png?inline' +``` + +### アセットを文字列としてインポートする {#importing-asset-as-string} アセットは末尾に `?raw` を付与することで文字列としてインポートすることができます。 -```js +```js twoslash +import 'vite/client' +// ---cut--- import shaderString from './shader.glsl?raw' ``` @@ -51,45 +80,48 @@ import shaderString from './shader.glsl?raw' スクリプトは末尾に `?worker` もしくは `?sharedworker` を付与することで web workers としてインポートすることができます。 -```js +```js twoslash +import 'vite/client' +// ---cut--- // Separate chunk in the production build import Worker from './shader.js?worker' const worker = new Worker() ``` -```js +```js twoslash +import 'vite/client' +// ---cut--- // sharedworker import SharedWorker from './shader.js?sharedworker' const sharedWorker = new SharedWorker() ``` -```js +```js twoslash +import 'vite/client' +// ---cut--- // Inlined as base64 strings import InlineWorker from './shader.js?worker&inline' ``` 詳細は [Web Worker section](./features.md#web-workers) を参照してください。 -## `public` ディレクトリ +## `public` ディレクトリー {#the-public-directory} アセットが以下のような場合のとき: -- ソースコードで参照されない (例: `robots.txt`) +- ソースコードで参照されない(例: `robots.txt`) - 全く同じファイル名を保持する必要がある(ハッシュ化しない) - …または、アセットの URL を取得するためだけに、アセットのインポートを単純に書きたくない -そのとき、プロジェクトのルート配下の特別な `public` ディレクトリにアセットを置くことができます。このディレクトリに配置されたアセットは開発環境ではルートパス `/` で提供され、そのまま dist ディレクトリのルートにコピーされます。 +そのとき、プロジェクトのルート配下の特別な `public` ディレクトリーにアセットを置くことができます。このディレクトリーに配置されたアセットは開発環境ではルートパス `/` で提供され、そのまま dist ディレクトリーのルートにコピーされます。 -ディレクトリのデフォルトは `/public` ですが、 [`publicDir` オプション](/config/shared-options.md#publicdir) で設定することができます。 +ディレクトリーのデフォルトは `/public` ですが、 [`publicDir` オプション](/config/shared-options.md#publicdir) で設定することができます。 -注意点: - -- `public` 内のアセットを絶対パスで参照する際は常に次のように行う必要があります。 - 例えば、 `public/icon.png` はソースコード内では `/icon.png` のように参照されなければなりません。 -- `public` 内のアセットは、 JavaScript からはインポートすることができません。 +`public` アセットは常にルート絶対パスを使用して参照する必要があることに注意してください。たとえば、`public/icon.png` はソースコード内で `/icon.png` として参照する必要があります。 ## new URL(url, import.meta.url) -[import.meta.url](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import.meta) は現在のモジュールの URL を公開するネイティブ ESM の機能です。ネイティブの [URL コンストラクタ](https://developer.mozilla.org/en-US/docs/Web/API/URL)と組み合わせることで、JavaScript モジュールからの相対パスを使用して静的アセットの完全に解決された URL を取得できます: +[import.meta.url](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import.meta) は現在のモジュールの URL を公開するネイティブ ESM の機能です。ネイティブの [URL コンストラクター](https://developer.mozilla.org/ja/docs/Web/API/URL)と組み合わせることで、JavaScript モジュールからの相対パスを使用して静的アセットの完全に解決された URL を取得できます: ```js const imgUrl = new URL('./img.png', import.meta.url).href @@ -97,12 +129,13 @@ const imgUrl = new URL('./img.png', import.meta.url).href document.getElementById('hero-img').src = imgUrl ``` -これはモダンブラウザでネイティブに動作します。実際、開発中に Vite はこのコードを処理する必要が全くありません! +これはモダンブラウザーでネイティブに動作します。実際、開発中に Vite はこのコードを処理する必要が全くありません! このパターンはテンプレートリテラルによる動的な URL もサポートします: ```js function getImageUrl(name) { + // サブディレクトリー内のファイルは含まれないことに注意してください return new URL(`./dir/${name}.png`, import.meta.url).href } ``` @@ -114,6 +147,25 @@ function getImageUrl(name) { const imgUrl = new URL(imagePath, import.meta.url).href ``` +::: details 動作の仕組み + +Vite は `getImageUrl` 関数を次のように変換します: + +```js +import __img0png from './dir/img0.png' +import __img1png from './dir/img1.png' + +function getImageUrl(name) { + const modules = { + './dir/img0.png': __img0png, + './dir/img1.png': __img1png, + } + return new URL(modules[`./dir/${name}.png`], import.meta.url).href +} +``` + +::: + ::: warning SSR では動作しません -ブラウザと Node.js で `import.meta.url` のセマンティクスが異なるため、 このパターンは Vite をサーバサイドレンダリングで使用している場合には動作しません。サーババンドルは事前にクライアントホストの URL を決定することもできません。 +ブラウザーと Node.js で `import.meta.url` のセマンティクスが異なるため、 このパターンは Vite をサーバーサイドレンダリングで使用している場合には動作しません。サーバーバンドルは事前にクライアントホストの URL を決定することもできません。 ::: diff --git a/guide/backend-integration.md b/guide/backend-integration.md index 19b5b2c9..4bb936f2 100644 --- a/guide/backend-integration.md +++ b/guide/backend-integration.md @@ -6,30 +6,37 @@ カスタム統合が必要な場合は、このガイドの手順に従って手順で設定することも可能です ::: -1. Vite の設定ファイルで、エントリの指定とマニフェストのビルドの有効化を行ってください: +1. Vite の設定ファイルで、エントリーの指定とマニフェストのビルドの有効化を行ってください: - ```js - // vite.config.js + ```js twoslash [vite.config.js] + import { defineConfig } from 'vite' + // ---cut--- export default defineConfig({ + server: { + cors: { + // ブラウザ経由でアクセスするオリジン + origin: 'http://my-backend.example.com', + }, + }, build: { - // outDir に manifest.json を出力 + // outDir に .vite/manifest.json を出力 manifest: true, rollupOptions: { - // デフォルトの .html エントリを上書き + // デフォルトの .html エントリーを上書き input: '/path/to/main.js', }, }, }) ``` - [module preload polyfill](/config/build-options.md#build-polyfillmodulepreload) を無効にしていない場合は、エントリで Polyfill をインポートする必要があります。 + [module preload polyfill](/config/build-options.md#build-polyfillmodulepreload) を無効にしていない場合は、エントリーで Polyfill をインポートする必要があります。 ```js - // アプリのエントリの先頭に追加 + // アプリのエントリーの先頭に追加 import 'vite/modulepreload-polyfill' ``` -2. 開発環境向けには以下をサーバの HTML テンプレートに含めてください。(`http://localhost:5173` を Vite が動作している URL に変更してください): +2. 開発環境向けには以下をサーバーの HTML テンプレートに含めてください。(`http://localhost:5173` を Vite が動作している URL に変更してください): ```html @@ -38,13 +45,12 @@ ``` アセットを適切に処理するには、2 つの選択肢があります。 - - - サーバが静的アセットのリクエストを Vite サーバにプロキシするよう設定されていることを確認する - - 生成されるアセット URL が相対パスではなく、バックエンドサーバの URL を使って解決されるよう [`server.origin`](/config/server-options.md#server-origin) を設定する + - サーバーが静的アセットのリクエストを Vite サーバーにプロキシするよう設定されていることを確認する + - 生成されるアセット URL が相対パスではなく、バックエンドサーバーの URL を使って解決されるよう [`server.origin`](/config/server-options.md#server-origin) を設定する これは、画像などのアセットを正しく読み込むために必要です。 - React と `@vitejs/plugin-react` を使用している場合、プラグインは配信している HTML を変更することができないので、上記のスクリプトの前に以下のスクリプトを追加する必要があります。 + React と `@vitejs/plugin-react` を使用している場合、プラグインは配信している HTML を変更することができないので、上記のスクリプトの前に以下のスクリプトを追加する必要があります(`http://localhost:5173` を Vite が動作しているローカル URL に置き換えます): ```html ``` -3. 本番環境向け: `vite build` を実行後、他のアセットファイルと共に `manifest.json` ファイルが生成されます。マニフェストファイルの内容は以下のようになります: +3. 本番環境向けには、`vite build` を実行後、他のアセットファイルと共に `.vite/manifest.json` ファイルが生成されます。マニフェストファイルの内容は以下のようになります: - ```json + ```json [.vite/manifest.json] { - "main.js": { - "file": "assets/main.4889e940.js", - "src": "main.js", + "_shared-B7PI925R.js": { + "file": "assets/shared-B7PI925R.js", + "name": "shared", + "css": ["assets/shared-ChJ_j-JJ.css"] + }, + "_shared-ChJ_j-JJ.css": { + "file": "assets/shared-ChJ_j-JJ.css", + "src": "_shared-ChJ_j-JJ.css" + }, + "logo.svg": { + "file": "assets/logo-BuPIv-2h.svg", + "src": "logo.svg" + }, + "baz.js": { + "file": "assets/baz-B2H3sXNv.js", + "name": "baz", + "src": "baz.js", + "isDynamicEntry": true + }, + "views/bar.js": { + "file": "assets/bar-gkvgaI9m.js", + "name": "bar", + "src": "views/bar.js", "isEntry": true, - "dynamicImports": ["views/foo.js"], - "css": ["assets/main.b82dbe22.css"], - "assets": ["assets/asset.0ab0f9cd.png"] + "imports": ["_shared-B7PI925R.js"], + "dynamicImports": ["baz.js"] }, "views/foo.js": { - "file": "assets/foo.869aea0d.js", + "file": "assets/foo-BRBmoGS9.js", + "name": "foo", "src": "views/foo.js", - "isDynamicEntry": true, - "imports": ["_shared.83069a53.js"] - }, - "_shared.83069a53.js": { - "file": "assets/shared.83069a53.js" + "isEntry": true, + "imports": ["_shared-B7PI925R.js"], + "css": ["assets/foo-5UjPuW-k.css"] } } ``` - - マニフェストは `Record` 構造になっています。 - - エントリまたはダイナミックエントリのチャンクの場合、プロジェクトルートからの相対パスがキーとなります。 - - エントリ以外のチャンクでは、生成されたファイル名の前に `_` を付けたものがキーとなります。 - - チャンクには、静的インポートと動的インポートの情報(どちらもマニフェスト内の対応するチャンクをマップするキー)と、それらと対応する CSS とアセットファイルが含まれます(あれば)。 + マニフェストは `Record` 構造になっており、各チャンクは `ManifestChunk` インターフェースに従います: + + ```ts + interface ManifestChunk { + src?: string + file: string + css?: string[] + assets?: string[] + isEntry?: boolean + name?: string + names?: string[] + isDynamicEntry?: boolean + imports?: string[] + dynamicImports?: string[] + } + ``` + + マニフェスト内の各エントリーは、以下のいずれかを表します: + - **エントリーチャンク**: [`build.rollupOptions.input`](https://rollupjs.org/configuration-options/#input) で指定されたファイルから生成されます。これらのチャンクには `isEntry: true` があり、キーはプロジェクトルートからの相対パスです。 + - **ダイナミックエントリーチャンク**: 動的インポートから生成されます。これらのチャンクには `isDynamicEntry: true` があり、キーはプロジェクトルートからの相対パスです。 + - **非エントリーチャンク**: キーは生成されたファイル名の前に `_` を付けたものです。 + - **アセットチャンク**: 画像やフォントなどのインポートされたアセットから生成されます。キーはプロジェクトルートからの相対パスです。 + - **CSS ファイル**: [`build.cssCodeSplit`](/config/build-options.md#build-csscodesplit) が `false` の場合、キー `style.css` で単一の CSS ファイルが生成されます。`build.cssCodeSplit` が `false` でない場合、キーは JS チャンクと同様に生成されます(つまり、エントリーチャンクは `_` プレフィックスなし、非エントリーチャンクは `_` プレフィックスあり)。 + + チャンクには、静的インポートと動的インポートの情報(どちらもマニフェスト内の対応するチャンクをマップするキー)と、それらと対応する CSS とアセットファイルが含まれます(あれば)。 + +4. このファイルを使用してハッシュを付加されたファイル名でリンクや preload directives をレンダリングすることができます。 + + 以下は、適切なリンクをレンダリングする HTML テンプレートの例です。ここでの構文は説明用なので、使用しているサーバーのテンプレート言語に替えてください。`importedChunks` 関数は説明用であり、Vite により提供されているわけではありません。 + - このファイルを使用してハッシュを付加されたファイル名でリンクや preload directives をレンダリングすることができます(注意: ここでの構文は説明用なので、使用しているサーバのテンプレート言語に替えてください): ```html - - + + + + + + + + + + + + ``` + + 具体的には、マニフェストファイルとエントリーポイントが指定された場合、HTML を生成するバックエンドは以下のタグを含める必要があります。最適なパフォーマンスのために、この順序に従うことが推奨されます: + + 1. エントリーポイントのチャンクの `css` リストのファイルごとに `` タグ(存在する場合) + 2. エントリーポイントの `imports` リスト内のすべてのチャンクを再帰的にたどり、インポートされた各チャンクの `css` リストのファイルごとに + `` タグを含める(存在する場合)。 + 3. エントリーポイントのチャンクの `file` キーに対するタグ。これは JavaScript に対する ` + + + ``` + + 一方、エントリーポイント `views/bar.js` に対しては、以下が含まれるはずです。 + + ```html + + + + + ``` + + ::: details `importedChunks` の疑似実装 + TypeScript での `importedChunks` の疑似実装の例(これは、プログラミング言語とテンプレート言語に合わせて調整する必要があります): + + ```ts + import type { Manifest, ManifestChunk } from 'vite' + + export default function importedChunks( + manifest: Manifest, + name: string, + ): ManifestChunk[] { + const seen = new Set() + + function getImportedChunks(chunk: ManifestChunk): ManifestChunk[] { + const chunks: ManifestChunk[] = [] + for (const file of chunk.imports ?? []) { + const importee = manifest[file] + if (seen.has(file)) { + continue + } + seen.add(file) + + chunks.push(...getImportedChunks(importee)) + chunks.push(importee) + } + + return chunks + } + + return getImportedChunks(manifest[name]) + } + ``` + + ::: diff --git a/guide/build.md b/guide/build.md index 355eaf87..9535ea80 100644 --- a/guide/build.md +++ b/guide/build.md @@ -2,20 +2,29 @@ 作成したアプリケーションを本番環境にデプロイするには、`vite build` コマンドを実行するだけです。デフォルトでは、ビルドのエントリーポイントとして `/index.html` を使用し、静的ホスティングサービスで提供するのに適したアプリケーションバンドルを生成します。一般的なサービスについてのガイドは [静的サイトのデプロイ](./static-deploy) をご覧ください。 -## ブラウザの互換性 +## ブラウザーの互換性 {#browser-compatibility} -本番バンドルではモダンな JavaScript のサポートを前提としています。Vite はデフォルトでは [ネイティブ ES モジュール](https://caniuse.com/es6-module)、 [ネイティブ ESM の動的インポート](https://caniuse.com/es6-module-dynamic-import)、 [`import.meta`](https://caniuse.com/mdn-javascript_operators_import_meta) をサポートするブラウザを対象としています: +デフォルトでは、プロダクションバンドルは [Baseline](https://web-platform-dx.github.io/web-features/) Widely Available ターゲットに含まれるモダンなブラウザーを前提としています。デフォルトのブラウザーサポート範囲は次のとおりです: -- Chrome >=87 -- Firefox >=78 -- Safari >=14 -- Edge >=88 + -[`build.target` 設定オプション](/config/build-options.md#build-target) を介してカスタムターゲットを指定することができます。最も低いターゲットは `es2015` です。 +- Chrome >=107 +- Edge >=107 +- Firefox >=104 +- Safari >=16 -Vite はデフォルトでは構文変換のみを扱い **デフォルトでは Polyfill をカバーしていない** ことに注意してください。ユーザのブラウザの UserAgent 文字列に基づいて Polyfill バンドルを自動生成するサービスの [Polyfill.io](https://polyfill.io/v3/) をチェックしてみてください。 +[`build.target` 設定オプション](/config/build-options.md#build-target)を介してカスタムターゲットを指定でき、最も低いターゲットは `es2015` です。より低いターゲットが設定された場合、Vite は[ネイティブ ESM の動的インポート](https://caniuse.com/es6-module-dynamic-import)と [`import.meta`](https://caniuse.com/mdn-javascript_operators_import_meta) に依存するため、以下の最小ブラウザサポート範囲が必要です: -レガシーブラウザは [@vitejs/plugin-legacy](https://github.com/vitejs/vite/tree/main/packages/plugin-legacy) を介してサポートすることができます。このプラグインはレガシーチャンクとそれに対応する ES 言語機能 Polyfill を自動的に生成します。レガシーチャンクは ESM をネイティブにサポートしていないブラウザでのみ条件付きで読み込まれます。 + + +- Chrome >=64 +- Firefox >=67 +- Safari >=11.1 +- Edge >=79 + +Vite はデフォルトでは構文変換のみを扱い **Polyfill をカバーしていない** ことに注意してください。ユーザーのブラウザーの UserAgent 文字列に基づいて Polyfill バンドルを自動生成する https://cdnjs.cloudflare.com/polyfill/ をチェックしてみてください。 + +レガシーブラウザーは [@vitejs/plugin-legacy](https://github.com/vitejs/vite/tree/main/packages/plugin-legacy) を介してサポートすることができます。このプラグインはレガシーチャンクとそれに対応する ES 言語機能 Polyfill を自動的に生成します。レガシーチャンクは ESM をネイティブにサポートしていないブラウザーでのみ条件付きで読み込まれます。 ## Public Base Path @@ -27,18 +36,27 @@ JS でインポートされたアセット URL、CSS の `url()` 参照、`.html 例外はその場で動的に URL を連結する必要がある場合です。この場合は、グローバルに注入された `import.meta.env.BASE_URL` 変数を使用することができ、これがベースのパブリックパスになります。この変数はビルド時に静的に置き換えられるので、そのままの形で表示されなければならないことに注意してください(つまり、`import.meta.env['BASE_URL']` は動作しません)。 -ベースパスの高度な制御については、[高度なベースパスの設定](#高度なベースパスの設定)を参照してください。 +ベースパスの高度な制御については、[高度なベースパスの設定](#advanced-base-options)を参照してください。 + +### 相対的な base + +ベースパスが事前にわからない場合は、相対的なベースパスとして `"base": "./"` または `"base": ""` を設定できます。これにより、生成されるすべての URL が各ファイルに対して相対的なものになります。 + +:::warning 相対的な base を使用する場合の古いブラウザーのサポート + +相対的な base には `import.meta` の対応が必要です。[`import.meta` に対応していないブラウザー](https://caniuse.com/mdn-javascript_operators_import_meta)をサポートする必要がある場合、[`legacy` プラグイン](https://github.com/vitejs/vite/tree/main/packages/plugin-legacy) が利用できます。 + +::: ## ビルドのカスタマイズ -ビルドは様々な [build 設定オプション](/config/build-options.md) でカスタマイズできます。特に、基礎となる [Rollup options](https://rollupjs.org/guide/en/#big-list-of-options) を `build.rollupOptions` で直接調整することができます: +ビルドは様々な [build 設定オプション](/config/build-options.md) でカスタマイズできます。特に、基礎となる [Rollup options](https://rollupjs.org/configuration-options/) を `build.rollupOptions` で直接調整することができます: -```js -// vite.config.js +```js [vite.config.js] export default defineConfig({ build: { rollupOptions: { - // https://rollupjs.org/guide/en/#big-list-of-options + // https://rollupjs.org/configuration-options/ }, }, }) @@ -48,28 +66,29 @@ export default defineConfig({ ## チャンク戦略 -チャンクの分割方法は `build.rollupOptions.output.manualChunks` で設定できます([Rollup ドキュメント](https://rollupjs.org/guide/en/#outputmanualchunks)参照)。Vite 2.8 まではデフォルトのチャンク戦略は `index` と `vendor` にチャンクを分割していました。これは SPA にはよい戦略の場合もありますが、すべての Vite ターゲットのユースケースに対して一般的な解決策を提供するのは困難です。Vite 2.9 からは、`manualChunks` はデフォルトでは変更されなくなりました。設定ファイルに `splitVendorChunkPlugin` を追加すれば、vendor を分割するチャンク戦略を引き続き使用できます: +チャンクの分割方法は `build.rollupOptions.output.manualChunks` で設定できます([Rollup ドキュメント](https://rollupjs.org/configuration-options/#output-manualchunks)参照)。フレームワークを使用する場合は、チャンクの分割方法の構成についてそのフレームワークのドキュメントを参照してください。 -```js -// vite.config.js -import { splitVendorChunkPlugin } from 'vite' -export default defineConfig({ - plugins: [splitVendorChunkPlugin()], +## 読み込みエラーのハンドリング + +Vite は動的インポートの読み込みに失敗したときに `vite:preloadError` イベントを出力します。`event.payload` には元のインポートエラーが含まれます。`event.preventDefault()` を呼んだ場合、エラーはスローされません。 + +```js twoslash +window.addEventListener('vite:preloadError', (event) => { + window.location.reload() // たとえば、ページをリロードする }) ``` -カスタムロジックによる合成が必要な場合に備えて、この戦略は `splitVendorChunk({ cache: SplitVendorChunkCache })` ファクトリとしても提供されます。この場合、ビルドウォッチモードが正しく動作するように、`cache.reset()` は `buildStart` で呼び出す必要があります。 +新しいデプロイが行われると、ホスティングサービスは前回のデプロイからアセットを削除することがあります。その結果、新しいデプロイメントの前にあなたのサイトを訪れたユーザーがインポートエラーに遭遇してしまう可能性があります。このエラーが起こるのは、そのユーザーのデバイス上で実行されているアセットが古くなり、対応する削除された古いチャンクをインポートしようとしてしまうためです。このイベントは、このような状況に対処するのに便利です。この場合、HTML ファイルに `Cache-Control: no-cache` を設定してください。そうしないと古いアセットが参照され続けてしまいます。 ## ファイル変更時のリビルド -`vite build --watch` で rollup のウォッチャを有効にすることができます。 また、`build.watch` を介して基礎となる [`WatcherOptions`](https://rollupjs.org/guide/en/#watch-options) を直接調整することもできます: +`vite build --watch` で rollup のウォッチャーを有効にすることができます。 また、`build.watch` を介して基礎となる [`WatcherOptions`](https://rollupjs.org/configuration-options/#watch) を直接調整することもできます: -```js -// vite.config.js +```js [vite.config.js] export default defineConfig({ build: { watch: { - // https://rollupjs.org/guide/en/#watch-options + // https://rollupjs.org/configuration-options/#watch }, }, }) @@ -77,7 +96,7 @@ export default defineConfig({ `--watch` フラグを有効にすると、`vite.config.js` やバンドルするファイルを変更した際に、リビルドがトリガーされます。 -## マルチページアプリ +## マルチページアプリ {#multi-page-app} 以下のようなソースコード構造があるとします: @@ -91,15 +110,17 @@ export default defineConfig({ └── nested.js ``` -開発時には、`/nested/` に移動またはリンクするだけで、通常の静的ファイルサーバと同じように期待通りに動作します。 +開発時には、`/nested/` に移動またはリンクするだけで、通常の静的ファイルサーバーと同じように期待通りに動作します。 ビルド時には、エントリーポイントとして複数の `.html` ファイルを指定するだけです: -```js -// vite.config.js -import { resolve } from 'path' +```js twoslash [vite.config.js] +import { dirname, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' import { defineConfig } from 'vite' +const __dirname = dirname(fileURLToPath(import.meta.url)) + export default defineConfig({ build: { rollupOptions: { @@ -112,30 +133,67 @@ export default defineConfig({ }) ``` -別のルートを指定した場合でも、入力パスを解決する際には `__dirname` が vite.config.js ファイルのフォルダになることに注意してください。そのため、`resolve` の引数に自分の `root` エントリを追加する必要があります。 +別のルートを指定した場合でも、入力パスを解決する際には `__dirname` が vite.config.js ファイルのフォルダーになることに注意してください。そのため、`resolve` の引数に自分の `root` エントリーを追加する必要があります。 + +HTML ファイルの場合、Vite は `rollupOptions.input` オブジェクトのエントリーに指定された名前を無視し、代わりに dist フォルダーに HTML アセットを生成する際にファイルの解決済み ID を尊重することに注意してください。これにより、開発サーバーの動作方法と一貫した構造が保証されます。 + +## ライブラリーモード {#library-mode} -## ライブラリモード +ブラウザー向けのライブラリーを開発していると、実際のライブラリーをインポートしたテスト/デモページにほとんどの時間を費やすことになると思われます。Vite を使えば、`index.html` をその目的のために使うことができスムーズな開発を行うことができます。 -ブラウザ向けのライブラリを開発していると、実際のライブラリをインポートしたテスト/デモページにほとんどの時間を費やすことになると思われます。Vite を使えば、`index.html` をその目的のために使うことができスムーズな開発を行うことができます。 +配布のためにライブラリーをバンドルするときには [`build.lib` 設定オプション](/config/build-options.md#build-lib) を使用します。また、ライブラリーにバンドルしたくない依存関係、例えば `vue` や `react` などは必ず外部化してください: -配布のためにライブラリをバンドルするときには [`build.lib` 設定オプション](/config/build-options.md#build-lib) を使用します。また、ライブラリにバンドルしたくない依存関係、例えば `vue` や `react` などは必ず外部化してください: +::: code-group -```js -// vite.config.js -import { resolve } from 'path' +```js twoslash [vite.config.js(単一エントリー)] +import { dirname, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' import { defineConfig } from 'vite' +const __dirname = dirname(fileURLToPath(import.meta.url)) + export default defineConfig({ build: { lib: { - // 複数のエントリーポイントのディクショナリや配列にもできます entry: resolve(__dirname, 'lib/main.js'), name: 'MyLib', // 適切な拡張子が追加されます fileName: 'my-lib' }, rollupOptions: { - // ライブラリにバンドルされるべきではない依存関係を + // ライブラリーにバンドルされるべきではない依存関係を + // 外部化するようにします + external: ['vue'], + output: { + // 外部化された依存関係のために UMD のビルドで使用する + // グローバル変数を提供します + globals: { + vue: 'Vue', + }, + }, + }, + }, +}) +``` + +```js twoslash [vite.config.js(複数エントリー)] +import { dirname, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' +import { defineConfig } from 'vite' + +const __dirname = dirname(fileURLToPath(import.meta.url)) + +export default defineConfig({ + build: { + lib: { + entry: { + 'my-lib': resolve(__dirname, 'lib/main.js'), + secondary: resolve(__dirname, 'lib/secondary.js'), + }, + name: 'MyLib', + }, + rollupOptions: { + // ライブラリーにバンドルされるべきではない依存関係を // 外部化するようにします external: ['vue'], output: { @@ -150,27 +208,35 @@ export default defineConfig({ }) ``` -エントリーファイルには、パッケージのユーザがインポートできるエクスポートが含まれることになります: +::: + +エントリーファイルには、パッケージのユーザーがインポートできるエクスポートが含まれることになります: -```js -// lib/main.js +```js [lib/main.js] import Foo from './Foo.vue' import Bar from './Bar.vue' export { Foo, Bar } ``` -この設定で `vite build` を実行するとライブラリの出荷を目的とした Rollup プリセットが使用され 2 つのバンドルフォーマットが生成されます。`es` と `umd` (`build.lib` で設定可能): +この設定で `vite build` を実行するとライブラリーの出荷を目的とした Rollup プリセットが使用され 2 つのバンドルフォーマットが生成されます: + +- `es` と `umd`(単一のエントリー用) +- `es` と `cjs`(複数のエントリー用) + +フォーマットは [`build.lib.formats`](/config/build-options.md#build-lib) オプションで設定できます。 ``` $ vite build building for production... -dist/my-lib.js 0.08 KiB / gzip: 0.07 KiB -dist/my-lib.umd.cjs 0.30 KiB / gzip: 0.16 KiB +dist/my-lib.js 0.08 kB / gzip: 0.07 kB +dist/my-lib.umd.cjs 0.30 kB / gzip: 0.16 kB ``` -ライブラリに推奨される `package.json`: +ライブラリーに推奨される `package.json`: -```json +::: code-group + +```json [package.json(単一エントリー)] { "name": "my-lib", "type": "module", @@ -186,9 +252,7 @@ dist/my-lib.umd.cjs 0.30 KiB / gzip: 0.16 KiB } ``` -あるいは、複数のエントリーポイントを公開する場合: - -```json +```json [package.json(複数エントリー)] { "name": "my-lib", "type": "module", @@ -208,51 +272,99 @@ dist/my-lib.umd.cjs 0.30 KiB / gzip: 0.16 KiB } ``` -::: tip Note +::: + +### CSS サポート + +ライブラリーが CSS をインポートしている場合、ビルドされた JS ファイルとは別に、単一の CSS ファイルとしてバンドルされます(例えば、`dist/my-lib.css` など)。デフォルトのファイル名は `build.lib.fileName` ですが、[`build.lib.cssFileName`](/config/build-options.md#build-lib) で変更することもできます。 + +ユーザーがインポートできるように、`package.json` で CSS ファイルをエクスポートできます: + +```json {12} +{ + "name": "my-lib", + "type": "module", + "files": ["dist"], + "main": "./dist/my-lib.umd.cjs", + "module": "./dist/my-lib.js", + "exports": { + ".": { + "import": "./dist/my-lib.js", + "require": "./dist/my-lib.umd.cjs" + }, + "./style.css": "./dist/my-lib.css" + } +} +``` + +::: tip ファイル拡張子 `package.json` が `"type": "module"` を含まない場合、Vite は Node.js の互換性のため異なるファイル拡張子を生成します。`.js` は `.mjs` に、`.cjs` は `.js` になります。 ::: -## 高度なベースパスの設定 +::: tip 環境変数 +ライブラリーモードでは、すべての [`import.meta.env.*`](./env-and-mode.md) の使用箇所はプロダクション用にビルドする際、静的に置き換えられます。ただし、`process.env.*` の使用箇所はそうではないので、ライブラリーの利用者は動的にそれを変更できます。これが望ましくない場合は、例えば `define: { 'process.env.NODE_ENV': '"production"' }` を使用して静的に置き換えたり、[`esm-env`](https://github.com/benmccann/esm-env) を使用してバンドラーやランタイムとの互換性を高めることができます。 +::: + +::: warning 高度な使い方 +ライブラリーモードには、ブラウザー向けのライブラリーや JS フレームワークライブラリーのためのシンプルで opinionated な設定が含まれています。非ブラウザーライブラリーをビルドする場合、または高度なビルドフローを必要とする場合は、[Rollup](https://rollupjs.org) または [esbuild](https://esbuild.github.io) を直接使用できます。 +::: + +## 高度なベースパスの設定 {#advanced-base-options} ::: warning -この機能は実験的で、semver を準拠せずに将来のマイナーバージョンで API が変更されることがあります。利用する際は Vite のマイナーバージョンを常に固定してください。 +この機能は実験的です。[フィードバックをしてください](https://github.com/vitejs/vite/discussions/13834)。 ::: 高度なユースケースでは、異なるキャッシュ戦略を利用する場合を例として、デプロイされたアセットファイルとパブリックファイルが別々のパスに存在することがあります。 ユーザーは 3 つの異なるパスにデプロイすることを選択することがあります: -- 生成されたエントリー HTML ファイル (SSR により処理されることがある) -- 生成されたハッシュ付きのアセット (JS や CSS や画像などのほかのファイル) -- コピーされた[パブリックファイル](assets.md#public-ディレクトリ) +- 生成されたエントリー HTML ファイル(SSR により処理されることがある) +- 生成されたハッシュ付きのアセット(JS や CSS や画像などのほかのファイル) +- コピーされた[パブリックファイル](assets.md#the-public-directory) このような事例では単一の静的な [base](#public-base-path) だけでは不十分です。Vite は `experimental.renderBuiltUrl` により、高度なベースパスの設定に対する実験的なサポートを提供します。 -```ts +```ts twoslash +import type { UserConfig } from 'vite' +// prettier-ignore +const config: UserConfig = { +// ---cut-before--- experimental: { - renderBuiltUrl(filename: string, { hostType }: { hostType: 'js' | 'css' | 'html' }) { + renderBuiltUrl(filename, { hostType }) { if (hostType === 'js') { return { runtime: `window.__toCdnUrl(${JSON.stringify(filename)})` } } else { return { relative: true } } - } + }, +}, +// ---cut-after--- } ``` -ハッシュ付きのアセットファイルとパブリックファイルが一緒にデプロイされていない場合は、関数に渡される 2 つ目の `context` パラメータに含まれるアセット `type` を使って、それぞれのグループに対する設定を独立して定義できます。 +ハッシュ付きのアセットファイルとパブリックファイルが一緒にデプロイされていない場合は、関数に渡される 2 つ目の `context` パラメーターに含まれるアセット `type` を使って、それぞれのグループに対する設定を独立して定義できます。 -```ts +```ts twoslash +import type { UserConfig } from 'vite' +import path from 'node:path' +// prettier-ignore +const config: UserConfig = { +// ---cut-before--- experimental: { - renderBuiltUrl(filename: string, { hostId, hostType, type }: { hostId: string, hostType: 'js' | 'css' | 'html', type: 'public' | 'asset' }) { + renderBuiltUrl(filename, { hostId, hostType, type }) { if (type === 'public') { return 'https://www.domain.com/' + filename - } - else if (path.extname(hostId) === '.js') { - return { runtime: `window.__assetsPath(${JSON.stringify(filename)})` } - } - else { + } else if (path.extname(hostId) === '.js') { + return { + runtime: `window.__assetsPath(${JSON.stringify(filename)})` + } + } else { return 'https://cdn.domain.com/assets/' + filename } - } + }, +}, +// ---cut-after--- } ``` + +渡される `filename` はデコードされた URL であり、関数が URL 文字列を返す場合には、その文字列もデコードする必要があるということに注意してください。Vite は URL をレンダリングする時にエンコーディングを自動的に処理します。ランタイムコードはそのままレンダリングされるため、`runtime` を持つオブジェクトが返される場合には、必要な場所で自分自身でエンコーディングを処理する必要があります。 diff --git a/guide/cli.md b/guide/cli.md index ccb4e582..40bf85c6 100644 --- a/guide/cli.md +++ b/guide/cli.md @@ -1,10 +1,10 @@ # コマンドラインインターフェイス -## 開発サーバ +## 開発サーバー ### `vite` -Vite 開発サーバをカレントディレクトリで起動します。開発環境ではウォッチモードに、CI では実行モードに自動的になります。 +Vite 開発サーバーをカレントディレクトリーで起動します。`vite dev` と `vite serve` は `vite` のエイリアスです。 #### 使い方 @@ -14,30 +14,31 @@ vite [root] #### オプション -| オプション | | -| ------------------------ | ----------------------------------------------------------------- | -| `--host [host]` | ホスト名を指定する (`string`) | -| `--port ` | ポートを指定する (`number`) | -| `--https` | TLS + HTTP/2 を使用する (`boolean`) | -| `--open [path]` | 起動時にブラウザを起動する (`boolean \| string`) | -| `--cors` | CORS を有効化する (`boolean`) | -| `--strictPort` | 指定されたポートが既に使用されている場合は終了する (`boolean`) | -| `--force` | オプティマイザにキャッシュを無視して再バンドルさせる (`boolean`) | -| `-c, --config ` | 指定された設定ファイルを使用する (`string`) | -| `--base ` | public のベースパス(デフォルト: `/`) (`string`) | -| `-l, --logLevel ` | Info \| warn \| error \| silent (`string`) | -| `--clearScreen` | ログを表示する際に画面をクリアするかどうか (`boolean`) | -| `-d, --debug [feat]` | デバッグログを表示する (`string \| boolean`) | -| `-f, --filter ` | デバッグログをフィルタリングする (`string`) | -| `-m, --mode ` | env モードを設定する (`string`) | -| `-h, --help` | 利用可能な CLI オプションを表示する | -| `-v, --version` | バージョン番号を表示する | +| オプション | | +| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `--host [host]` | ホスト名を指定する(`string`) | +| `--port ` | ポートを指定する(`number`) | +| `--open [path]` | 起動時にブラウザーを起動する(`boolean \| string`) | +| `--cors` | CORS を有効化する(`boolean`) | +| `--strictPort` | 指定されたポートが既に使用されている場合は終了する(`boolean`) | +| `--force` | オプティマイザーにキャッシュを無視して再バンドルさせる(`boolean`) | +| `-c, --config ` | 指定された設定ファイルを使用する(`string`) | +| `--base ` | public のベースパス(デフォルト: `/`)(`string`) | +| `-l, --logLevel ` | info \| warn \| error \| silent (`string`) | +| `--clearScreen` | ログを表示する際に画面をクリアするかどうか(`boolean`) | +| `--configLoader ` | `bundle`: esbuild を使用して設定をバンドルする。`runner`(実験的機能): その場で処理する。`native`(実験的機能): ネイティブランタイムを使用して読み込む(デフォルト: `bundle`) | +| `--profile` | 組み込みの Node.js インスペクターを起動する([パフォーマンスのボトルネック](/guide/troubleshooting#performance-bottlenecks)を確認してください) | +| `-d, --debug [feat]` | デバッグログを表示する(`string \| boolean`) | +| `-f, --filter ` | デバッグログをフィルタリングする(`string`) | +| `-m, --mode ` | env モードを設定する(`string`) | +| `-h, --help` | 利用可能な CLI オプションを表示する | +| `-v, --version` | バージョン番号を表示する | ## ビルド ### `vite build` -本番用にビルドします。 +プロダクション用にビルドします。 #### 使い方 @@ -49,26 +50,27 @@ vite build [root] | オプション | | | ------------------------------ | ------------------------------------------------------------------------------------------------------------------- | -| `--target ` | トランスパイル対象(デフォルト: `"modules"`) (`string`) | -| `--outDir ` | 出力ディレクトリ(デフォルト: `dist`) (`string`) | -| `--assetsDir ` | 出力先のディレクトリ内で静的アセットを配置するディレクトリ(デフォルト: `"assets"`) (`string`) | -| `--assetsInlineLimit ` | 静的アセットを base64 inline 化する閾値(単位はバイト。デフォルト: `4096`) (`number`) | -| `--ssr [entry]` | サーバーサイドレンダリング用に特定のエントリをビルドする (`string`) | -| `--sourcemap` | ビルド用のソースマップを出力する (デフォルト: `false`) (`boolean`) | -| `--minify [minifier]` | 最小化を有効/無効にする、または使用するミニファイアを指定する (デフォルト: `"esbuild"`) (`boolean \| "terser" \| "esbuild"`) | -| `--manifest [name]` | ビルドマニフェスト JSON を出力する (`boolean \| string`) | -| `--ssrManifest [name]` | SSR マニフェスト JSON を出力する (`boolean \| string`) | -| `--force` | オプティマイザにキャッシュを無視して再バンドルさせる(実験的機能)(`boolean`) | -| `--emptyOutDir` | root の外部に outDir がある場合、outDir を強制的に空にする (`boolean`) | -| `-w, --watch` | ディスク上のモジュールが変更されたときに再ビルドする (`boolean`) | -| `-c, --config ` | 指定された設定ファイルを使用する (`string`) | -| `--base ` | public のベースパス(デフォルト: `/`) (`string`) | -| `-l, --logLevel ` | Info \| warn \| error \| silent (`string`) | -| `--clearScreen` | ログを表示する際に画面をクリアするかどうか (`boolean`) | -| `-d, --debug [feat]` | デバッグログを表示する (`string \| boolean`) | -| `-f, --filter ` | デバッグログをフィルタリングする (`string`) | -| `-m, --mode ` | env モードを設定する (`string`) | +| `--target ` | トランスパイル対象(デフォルト: `"modules"`)(`string`) | +| `--outDir ` | 出力ディレクトリー(デフォルト: `dist`)(`string`) | +| `--assetsDir ` | 出力先のディレクトリー内で静的アセットを配置するディレクトリー(デフォルト: `"assets"`)(`string`) | +| `--assetsInlineLimit ` | 静的アセットを base64 inline 化する閾値(単位はバイト。デフォルト: `4096`)(`number`) | +| `--ssr [entry]` | サーバーサイドレンダリング用に特定のエントリーをビルドする(`string`) | +| `--sourcemap [output]` | ビルド用のソースマップを出力する(デフォルト: `false`)(`boolean \| "inline" \| "hidden"`) | +| `--minify [minifier]` | 最小化を有効/無効にする、または使用するミニファイアを指定する(デフォルト: `"esbuild"`)(`boolean \| "terser" \| "esbuild"`)| +| `--manifest [name]` | ビルドマニフェスト JSON を出力する(`boolean \| string`) | +| `--ssrManifest [name]` | SSR マニフェスト JSON を出力する(`boolean \| string`) | +| `--emptyOutDir` | root の外部に outDir がある場合、outDir を強制的に空にする(`boolean`) | +| `-w, --watch` | ディスク上のモジュールが変更されたときに再ビルドする(`boolean`) | +| `-c, --config ` | 指定された設定ファイルを使用する(`string`) | +| `--base ` | public のベースパス(デフォルト: `/`)(`string`) | +| `-l, --logLevel ` | Info \| warn \| error \| silent (`string`) | +| `--clearScreen` | ログを表示する際に画面をクリアするかどうか(`boolean`) | +| `--profile` | 組み込みの Node.js インスペクターを起動する([パフォーマンスのボトルネック](/guide/troubleshooting#performance-bottlenecks)を確認してください)| +| `-d, --debug [feat]` | デバッグログを表示する(`string \| boolean`) | +| `-f, --filter ` | デバッグログをフィルタリングする(`string`) | +| `-m, --mode ` | env モードを設定する(`string`) | | `-h, --help` | 利用可能な CLI オプションを表示する | +| `--app` | すべての環境をビルドする。`builder: {}` と同じ。(`boolean`、実験的機能) | ## その他 @@ -76,6 +78,8 @@ vite build [root] 依存関係を事前バンドルします。 +**非推奨**: 事前バンドルのプロセスは自動的に実行されるため、呼び出す必要はありません。 + #### 使い方 ```bash @@ -86,19 +90,21 @@ vite optimize [root] | オプション | | | ------------------------ | ----------------------------------------------------------------- | -| `--force` | オプティマイザにキャッシュを無視して再バンドルさせる (`boolean`) | -| `-c, --config ` | 指定された設定ファイルを使用する (`string`) | -| `--base ` | public のベースパス(デフォルト: `/`) (`string`) | -| `-l, --logLevel ` | Info \| warn \| error \| silent (`string`) | -| `--clearScreen` | ログを表示する際に画面をクリアするかどうか (`boolean`) | -| `-d, --debug [feat]` | デバッグログを表示する (`string \| boolean`) | -| `-f, --filter ` | デバッグログをフィルタリングする (`string`) | -| `-m, --mode ` | env モードを設定する (`string`) | +| `--force` | オプティマイザーにキャッシュを無視して再バンドルさせる(`boolean`)| +| `-c, --config ` | 指定された設定ファイルを使用する(`string`) | +| `--base ` | public のベースパス(デフォルト: `/`)(`string`) | +| `-l, --logLevel ` | Info \| warn \| error \| silent (`string`) | +| `--clearScreen` | ログを表示する際に画面をクリアするかどうか(`boolean`) | +| `-d, --debug [feat]` | デバッグログを表示する(`string \| boolean`) | +| `-f, --filter ` | デバッグログをフィルタリングする(`string`) | +| `-m, --mode ` | env モードを設定する(`string`) | | `-h, --help` | 利用可能な CLI オプションを表示する | ### `vite preview` -本番ビルドをローカルでプレビューします。 +プロダクションビルドをローカルでプレビューします。プロダクション用として設計されていないため、プロダクション用サーバーとして使用しないでください。 + +このコマンドは、ビルドディレクトリー(デフォルトは `dist`)でサーバーを起動します。ビルドディレクトリーが最新であることを確認するために、事前に `vite build` を実行してください。プロジェクトで設定された [`appType`](/config/shared-options.html#apptype) に応じて、特定のミドルウェアを使用します。 #### 使い方 @@ -110,17 +116,16 @@ vite preview [root] | オプション | | | ------------------------ | ---------------------------------------------------- | -| `--host [host]` | ホスト名を指定する (`string`) | -| `--port ` | ポートを指定する (`number`) | -| `--strictPort` | 指定されたポートが既に使用されている場合は終了する (`boolean`) | -| `--https` | TLS + HTTP/2 を使用する (`boolean`) | -| `--open [path]` | 起動時にブラウザを起動する (`boolean \| string`) | -| `--outDir ` | 出力ディレクトリ(デフォルト: `dist`) (`string`) | -| `-c, --config ` | 指定された設定ファイルを使用する (`string`) | -| `--base ` | public のベースパス(デフォルト: `/`) (`string`) | -| `-l, --logLevel ` | Info \| warn \| error \| silent (`string`) | -| `--clearScreen` | ログを表示する際に画面をクリアするかどうか (`boolean`) | -| `-d, --debug [feat]` | デバッグログを表示する (`string \| boolean`) | -| `-f, --filter ` | デバッグログをフィルタリングする (`string`) | -| `-m, --mode ` | env モードを設定する (`string`) | +| `--host [host]` | ホスト名を指定する(`string`) | +| `--port ` | ポートを指定する(`number`) | +| `--strictPort` | 指定されたポートが既に使用されている場合は終了する(`boolean`)| +| `--open [path]` | 起動時にブラウザーを起動する(`boolean \| string`) | +| `--outDir ` | 出力ディレクトリー(デフォルト: `dist`)(`string`) | +| `-c, --config ` | 指定された設定ファイルを使用する(`string`) | +| `--base ` | public のベースパス(デフォルト: `/`)(`string`) | +| `-l, --logLevel ` | Info \| warn \| error \| silent (`string`) | +| `--clearScreen` | ログを表示する際に画面をクリアするかどうか(`boolean`) | +| `-d, --debug [feat]` | デバッグログを表示する(`string \| boolean`) | +| `-f, --filter ` | デバッグログをフィルタリングする(`string`) | +| `-m, --mode ` | env モードを設定する(`string`) | | `-h, --help` | 利用可能な CLI オプションを表示する | diff --git a/guide/comparisons.md b/guide/comparisons.md deleted file mode 100644 index 4943a470..00000000 --- a/guide/comparisons.md +++ /dev/null @@ -1,21 +0,0 @@ -# 比較 - -## WMR - -Preact チームが開発した [WMR](https://github.com/preactjs/wmr) にも似たような機能群があり、Vite 2.0 の Rollup プラグインインタフェイスのサポートは、これに影響を受けています。 - -WMR は主に [Preact](https://preactjs.com/) プロジェクトのために開発されていて、プリレンダリングなどのより統合された機能を提供しています。スコープの点では、Preact meta framework に近いものです。Preact を使用しているなら、WMR はより洗練された経験をもたらしてくれるでしょう。 - -## @web/dev-server - -[@web/dev-server](https://modern-web.dev/docs/dev-server/overview/)(旧称 `es-dev-server`)は素晴らしいプロジェクトです。Vite 1.0 の Koa ベースのサーバのセットアップはこのプロジェクトに影響を受けたものです。 - -`@web/dev-server` はスコープの点では少し低レベルです。公式のフレームワークとの統合を提供しておらず、本番ビルドのためには Rollup の設定を手動でセットアップする必要があります。 - -全体として、Vite はより out-of-the-box なワークフローを提供することを目的とした opinionated で高レベルのツールです。しかし、`@web` アンブレラプロジェクト内には、その他にも Vite ユーザにも役に立つ優れたツールが存在します。 - -## Snowpack - -[Snowpack](https://www.snowpack.dev/) も no-bundle ネイティブな ESM の開発サーバで、Vite と非常に近い目的を持っています。このプロジェクトは今ではメンテナンスされていません。現在、Snowpack チームは Vite を利用した静的サイトビルダーである [Astro](https://astro.build/) の開発に取り組んでいます。Astro チームは現在、エコシステムでの活発なプレイヤーであり、Vite の改良に貢献しています。 - -実装の詳細が異なる点を除き、2 つのプロジェクトは伝統的なツールより技術的に優れている点で非常に多くの共通点があります。Vite の依存関係の事前ビルドの機能は、Snowpack v1(現在の[`esinstall`](https://github.com/snowpackjs/snowpack/tree/main/esinstall))にも影響を受けています。2 つのプロジェクト間の大きな違いは、[v2の比較ガイド](https://v2.vitejs.dev/guide/comparisons) に列挙されています。 diff --git a/guide/dep-pre-bundling.md b/guide/dep-pre-bundling.md index 3d48d581..729552aa 100644 --- a/guide/dep-pre-bundling.md +++ b/guide/dep-pre-bundling.md @@ -1,13 +1,6 @@ # 依存関係の事前バンドル -初めて、`vite` を実行すると、次のメッセージが表示される場合があります: - -``` -Pre-bundling dependencies: - react - react-dom -(this will be run only when your dependencies or config have changed) -``` +初めて、`vite` を実行すると、Vite は、あなたのサイトをローカルで読み込む前に、プロジェクトの依存関係を事前バンドルします。これはデフォルトで自動的に、かつ透過的に行われます。 ## その理由は? @@ -15,7 +8,7 @@ Pre-bundling dependencies: このプロセスには 2 つの目的があります: -1. **CommonJS と UMD の互換性:** 開発中の Vite のコードは ECMAScript モジュールとして提供しています。そのため、Vite は、CommonJS または、UMD を ESM に変換する必要があります。CommonJS の依存関係を変換する場合、Vite はインポート文をスマート分析を実行してエクスポートが動的に割り当てられていても、CommonJS モジュールは期待通りに動作します。(例 React): +1. **CommonJS と UMD の互換性:** 開発中の Vite のコードは ECMAScript モジュールとして提供しています。そのため、Vite は、CommonJS または、UMD を ESM に変換する必要があります。CommonJS の依存関係を変換する場合、Vite はインポート文をスマート分析を実行してエクスポートが動的に割り当てられていても、CommonJS モジュールは期待通りに動作します。(例 React): ```js // works as expected @@ -24,7 +17,7 @@ Pre-bundling dependencies: 2. **パフォーマンス:** Vite は、多くの内部モジュールを持つ ESM の依存関係を単一のモジュールに変換して、その後のページロードのパフォーマンスを向上させます。いくつかのパッケージでは、ECMAScript モジュールのビルドを、相互にインポートする別々のファイルとして出力します。 -一例として [`lodash-es`](https://unpkg.com/browse/lodash-es/) には、600 以上の内部モジュールがあります。`import { debounce } from 'lodash-es'` をすると、ブラウザは 600 以上の HTTP リクエストを同時に処理します! サーバ側では問題なく処理していても、大量のリクエストによりブラウザ側でネットワークの混雑が発生し、ページの読み込みが著しく遅くなってしまいます。 +一例として [`lodash-es`](https://unpkg.com/browse/lodash-es/) には、600 以上の内部モジュールがあります。`import { debounce } from 'lodash-es'` をすると、ブラウザーは 600 以上の HTTP リクエストを同時に処理します! サーバー側では問題なく処理していても、大量のリクエストによりブラウザー側でネットワークの混雑が発生し、ページの読み込みが著しく遅くなってしまいます。 事前に `lodash-es` を単一のモジュールにバンドルすることにより HTTP リクエストは 1 つだけで済むようになりました。 @@ -34,17 +27,19 @@ Pre-bundling dependencies: ## 依存関係の自動検出 -既存のキャッシュが見つからない場合、Vite はソースコードをクロールし、依存関係のインポート(すなわち、`node_modules` から解決されることを期待されている "bare imports")を自動的に検出します。そして、検出されたインポートを事前バンドルのエントリポイントとして使用します。事前バンドルは `esbuild` で実行されるので、例のごとく非常に高速です。 +既存のキャッシュが見つからない場合、Vite はソースコードをクロールし、依存関係のインポート(すなわち、`node_modules` から解決されることを期待されている "bare imports")を自動的に検出します。そして、検出されたインポートを事前バンドルのエントリーポイントとして使用します。事前バンドルは `esbuild` で実行されるので、例のごとく非常に高速です。 -サーバを起動したあと、キャッシュにない新しい依存関係のインポートに遭遇した場合は、Vite は依存関係の事前バンドルを再実行し、ページをリロードします。 +サーバーを起動したあと、キャッシュにない新しい依存関係のインポートに遭遇した場合は、Vite は依存関係の事前バンドルを再実行し、必要に応じてページをリロードします。 ## モノレポとリンクされた依存関係 -モノレポの設定では、依存関係は同じリポジトリからのリンクされたパッケージの可能性があります。Vite は `node_modules` から解決されない依存関係を自動的に検出し、リンクされた依存関係をソースコードとして扱います。リンクされた依存関係をバンドルしようとはせず、代わりにリンクされた依存関係のリストを分析します。 +モノレポの設定では、依存関係は同じリポジトリーからのリンクされたパッケージの可能性があります。Vite は `node_modules` から解決されない依存関係を自動的に検出し、リンクされた依存関係をソースコードとして扱います。リンクされた依存関係をバンドルしようとはせず、代わりにリンクされた依存関係のリストを分析します。 ただしこの場合、リンクされた依存関係が ESM としてエクスポートされている必要があります。そうでない場合は、[`optimizeDeps.include`](/config/dep-optimization-options.md#optimizedeps-include) と [`build.commonjsOptions.include`](/config/build-options.md#build-commonjsoptions) に依存関係を追加して、設定することができます。 -```js +```js twoslash [vite.config.js] +import { defineConfig } from 'vite' +// ---cut--- export default defineConfig({ optimizeDeps: { include: ['linked-dep'], @@ -59,17 +54,15 @@ export default defineConfig({ リンクされた依存関係を変更する場合は、`--force` コマンドラインオプションを指定して開発サーバーを再起動すると、変更が有効になります。 -::: warning Deduping -リンクされた依存関係は、依存関係の解決方法の違いにより、推移的な依存関係が不正に重複排除されることがあり、実行時に問題が発生することがあります。この問題につまずいた場合は、リンクされた依存関係に対して `npm pack` を使って修正します。 -::: - ## 挙動のカスタマイズ デフォルトのヒューリスティックな方法による依存関係の発見によって、必ずしも望ましい結果が得られるとは限りません。リストから依存関係を明示的に含めたり除外したりする場合は、[`optimizeDeps` 設定オプション](/config/dep-optimization-options.md)を使用してください。 -`optimizeDeps.include` または `optimizeDeps.exclude` の一般的な使用例は、ソースコードで直接検出できないインポートがある場合です。たとえば、インポートはプラグイン変換の結果として作成される可能性があります。これは、Vite が最初のスキャンでインポートを検出できないことを意味します。つまり、ファイルがブラウザによって要求されて変換された後にのみ、インポートを検出できます。 これにより、サーバの起動後すぐにサーバが再バンドルされます。 +`optimizeDeps.include` または `optimizeDeps.exclude` の一般的な使用例は、ソースコードで直接検出できないインポートがある場合です。たとえば、インポートはプラグイン変換の結果として作成される可能性があります。これは、Vite が最初のスキャンでインポートを検出できないことを意味します。つまり、ファイルがブラウザーによって要求されて変換された後にのみ、インポートを検出できます。 これにより、サーバーの起動後すぐにサーバーが再バンドルされます。 + +これには、`include` と `exclude` の両方が使用できます。依存関係が大きい(多くの内部モジュールがある)場合や、CommonJS の場合には、それを含める必要があります。依存関係が小さく、すでに有効な ESM の場合には、それを除外し、ブラウザーに直接読み込ませることができます。 -これには、`include` と `exclude` の両方が使用できます。依存関係が大きい(多くの内部モジュールがある)場合や、CommonJS の場合には、それを含める必要があります。依存関係が小さく、すでに有効な ESM の場合には、それを除外し、ブラウザに直接読み込ませることができます。 +esbuild も [`optimizeDeps.esbuildOptions` オプション](/config/dep-optimization-options.md#optimizedeps-esbuildoptions)でさらにカスタマイズできます。例えば、esbuild のプラグインを追加して、依存関係にある特殊なファイルを扱えるようにするか、[build `target`](https://esbuild.github.io/api/#target) を変更します。 ## キャッシュ @@ -77,19 +70,19 @@ export default defineConfig({ Vite は、`node_modules/.vite` に、事前バンドル済みの依存関係をキャッシュします。いくつかのソースに基づいて、事前バンドルを再実行する必要があるかどうか決定します: -- パッケージマネージャのロックファイルの内容、例: `package-lock.json`、`yarn.lock`、`pnpm-lock.yaml`、`bun.lockb` など。 +- パッケージマネージャーのロックファイルの内容、例: `package-lock.json`、`yarn.lock`、`pnpm-lock.yaml`、`bun.lock` など。 - もし存在すれば、vite.config.js の関連するフィールド。 -- パッチフォルダの変更時間。 +- パッチフォルダーの変更時間。 - `NODE_ENV` の値。 上記のいずれかが変更された場合のみ、事前バンドルを再実行する必要があります。 -何らかの理由で Vite に再バンドルを強制したい場合は、開発サーバを `--force` コマンドラインオプションで起動するか、手動で `node_modules/.vite` のキャッシュディレクトリを削除します。 +何らかの理由で Vite に再バンドルを強制したい場合は、開発サーバーを `--force` コマンドラインオプションで起動するか、手動で `node_modules/.vite` のキャッシュディレクトリーを削除します。 -### ブラウザ キャッシュ +### ブラウザーキャッシュ {#browser-cache} -解決された依存関係のリクエストは、開発中のページの再読み込みのパフォーマンスを向上させるために、HTTP ヘッダ `max-age = 31536000、immutable` で積極的にキャッシュされます。一度キャッシュされると、これらのリクエストは開発サーバに再び到達することはありません。異なるバージョンがインストールされた(パッケージマネージャのロックファイルに反映された)場合は、付与されているバージョンクエリによって自動的に無効になります。ローカルでの編集で依存関係をデバッグしたい場合は、以下のように行えます: +解決された依存関係のリクエストは、開発中のページの再読み込みのパフォーマンスを向上させるために、HTTP ヘッダー `max-age = 31536000、immutable` で積極的にキャッシュされます。一度キャッシュされると、これらのリクエストは開発サーバーに再び到達することはありません。異なるバージョンがインストールされた(パッケージマネージャーのロックファイルに反映された)場合は、付与されているバージョンクエリーによって自動的に無効になります。ローカルでの編集で依存関係をデバッグしたい場合は、以下のように行えます: -1. ブラウザの devtools のネットワークタブからキャッシュを一時的に無効にします。 -2. Vite 開発サーバを `--force` フラグで再起動して、依存関係を再バンドルします。 +1. ブラウザーの devtools のネットワークタブからキャッシュを一時的に無効にします。 +2. Vite 開発サーバーを `--force` フラグで再起動して、依存関係を再バンドルします。 3. ページをリロードします。 diff --git a/guide/env-and-mode.md b/guide/env-and-mode.md index a8eeadb5..353d6b2b 100644 --- a/guide/env-and-mode.md +++ b/guide/env-and-mode.md @@ -1,93 +1,127 @@ # 環境変数とモード -## Env Variables +Vite は特定の定数を特別な `import.meta.env` オブジェクトの下で公開します。この定数は開発中はグローバル変数として定義され、ビルド時にはツリーシェイキングを効果的に行うために静的に置き換えられます。 -Vite は環境変数を特別な **`import.meta.env`** オブジェクトに公開します。いくつかのビルトイン変数は全てのケースで利用可能です: +:::details 例 + +```js +if (import.meta.env.DEV) { + // この中のコードは本番ビルドでツリーシェイキングされます + console.log('Dev mode') +} +``` + +::: + +## ビルトイン定数 + +いくつかのビルトイン定数は全てのケースで利用可能です: - **`import.meta.env.MODE`**: {string} アプリが動作している[モード](#modes)。 - **`import.meta.env.BASE_URL`**: {string} アプリが配信されているベース URL。これは [`base` 設定オプション](/config/shared-options.md#base) によって決まります。 -- **`import.meta.env.PROD`**: {boolean} アプリがプロダクションで動作しているかどうか。 +- **`import.meta.env.PROD`**: {boolean} アプリがプロダクションで動作しているかどうか(`NODE_ENV='production'` で開発サーバーを起動するか `NODE_ENV='production'` でビルドしたアプリを実行する)。 - **`import.meta.env.DEV`**: {boolean} アプリが開発で動作しているかどうか(常に `import.meta.env.PROD` の逆) -- **`import.meta.env.SSR`**: {boolean} アプリが[サーバ](./ssr.md#条件付きロジック)で動作しているかどうか +- **`import.meta.env.SSR`**: {boolean} アプリが[サーバー](./ssr.md#conditional-logic)で動作しているかどうか -### Production Replacement +## 環境変数 {#env-variables} -プロダクションでは、これらの環境変数は、**静的に置換されます**。したがって、常に、完全な静的文字列を使って参照する必要があります。例えば、`import.meta.env[key]` のような動的なキーでのアクセスはうまく行きません。 +Vite は環境変数を `import.meta.env` オブジェクトの下で自動的に文字列として公開します。 -JavaScript の文字列と Vue テンプレートの中に現れる文字列も置換されます。これはまれなケースのはずですが、意図的でないこともありえます。この場合、たとえば `"process.env.``NODE_ENV: "` が `""development": "` に変換されると、`Missing Semicolon` や `Unexpected token` などのエラーが表示されることがあります。この挙動を一時的に解決する方法はいくつかあります: +環境変数が誤ってクライアントに漏れてしまうことを防ぐために、`VITE_` から始まる変数のみが Vite で処理されたコードに公開されます。例えば、以下の環境変数だと: -- JavaScript の文字列に対しては、ユニコードの​ゼロ幅スペースでその文字列を分割できます(例 `'import.meta\u200b.env.MODE'`)。 +```[.env] +VITE_SOME_KEY=123 +DB_PASSWORD=foobar +``` -- Vue のテンプレートや他の HTML タグに対しては、[`` タグ](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr)を使うことができます(例 `import.meta.env.MODE`)。 +`VITE_SOME_KEY` だけが `import.meta.env.VITE_SOME_KEY` としてクライアントソースコードに公開され、`DB_PASSWORD` は公開されません。 -## `.env` Files +```js +console.log(import.meta.env.VITE_SOME_KEY) // "123" +console.log(import.meta.env.DB_PASSWORD) // undefined +``` + +環境変数のプレフィックスをカスタマイズしたい場合は、[envPrefix](/config/shared-options.html#envprefix) オプションを参照してください。 -Vite は、[環境ディレクトリ](/config/shared-options.md#envdir)にある以下のファイルから追加の環境変数を読み込むために [dotenv](https://github.com/motdotla/dotenv) を利用します。 +:::tip env のパース +上に示したように、`VITE_SOME_KEY` は数値ですが、パースすると文字列が返ります。同じことはブール型の環境変数にも起こります。コード内で使用する場合には、必ず目的の型に変換するようにしてください。 +::: + +### `.env` ファイル {#env-files} + +Vite は、[環境ディレクトリー](/config/shared-options.md#envdir)にある以下のファイルから追加の環境変数を読み込むために [dotenv](https://github.com/motdotla/dotenv) を利用します。 ``` .env # 全ての場合に読み込まれる -.env.local # 全ての場合に読み込まれ、gitには無視される +.env.local # 全ての場合に読み込まれ、git には無視される .env.[mode] # 指定されたモードでのみ読み込まれる -.env.[mode].local # 指定されたモードでのみ読み込まれ、gitには無視される +.env.[mode].local # 指定されたモードでのみ読み込まれ、git には無視される ``` :::tip env 読み込みの優先度 特定のモードの env ファイル(例: `.env.production`)は、汎用の env ファイル(例: `.env`)よりも優先されます。 -また、Vite の実行時に既に存在している環境変数は最も優先度が高く、`.env` ファイルによって上書きされることはありません。例えば、`VITE_SOME_KEY=123 vite build` を実行する場合。 - -`.env` は Vite 起動時に読み込まれます。変更した後はサーバを再起動してください。 -::: +Vite は特定のモードの `.env.[mode]` ファイルに加えて、常に `.env` と `.env.local` を読み込みます。特定のモードのファイルで宣言された変数は汎用のファイル内の変数より優先されますが、`.env` または `.env.local` でのみ定義された変数は、引き続き環境で利用できます。 -読み込まれた環境変数は、`import.meta.env` を経由してクライアントソースコードにも文字列として公開されます。 - -環境変数が誤ってクライアントに漏れてしまうことを防ぐために、`VITE_` から始まる変数のみが Vite で処理されたコードに公開されます。例えば、以下の環境変数だと: - -``` -VITE_SOME_KEY=123 -DB_PASSWORD=foobar -``` +また、Vite の実行時に既に存在している環境変数は最も優先度が高く、`.env` ファイルによって上書きされることはありません。例えば、`VITE_SOME_KEY=123 vite build` を実行する場合。 -`VITE_SOME_KEY` だけが `import.meta.env.VITE_SOME_KEY` としてクライアントソースコードに公開され、`DB_PASSWORD` は公開されません。 +`.env` は Vite 起動時に読み込まれます。変更した後はサーバーを再起動してください。 -```js -console.log(import.meta.env.VITE_SOME_KEY) // 123 -console.log(import.meta.env.DB_PASSWORD) // undefined -``` +::: -また、Vite は [dotenv-expand](https://github.com/motdotla/dotenv-expand) を使って、設定不要で変数を展開できます。構文の詳細については、[ドキュメント](https://github.com/motdotla/dotenv-expand#what-rules-does-the-expansion-engine-follow)を参照してください。 +また、Vite は [dotenv-expand](https://github.com/motdotla/dotenv-expand) を使って、設定不要で env ファイルに書かれた変数を展開できます。構文の詳細については、[ドキュメント](https://github.com/motdotla/dotenv-expand#what-rules-does-the-expansion-engine-follow)を参照してください。 環境値の中で `$` を使用する場合は、`\` でエスケープする必要があることに注意してください。 -``` +```[.env] KEY=123 NEW_KEY1=test$foo # test NEW_KEY2=test\$foo # test$foo NEW_KEY3=test$KEY # test123 ``` -環境変数のプレフィックスをカスタマイズしたい場合は、[envPrefix](/config/shared-options.html#envprefix) オプションを参照してください。 - :::warning SECURITY NOTES - `.env.*.local` ファイルはローカル限定で、センシティブな変数を含めることができます。git にチェックインされるのを防ぐために、`.gitignore` に `*.local` を追加すべきです。 - Vite のソースコードに公開される変数は最終的にクライアントバンドルに入るので、`VITE_*` 変数はセンシティブな情報を*含まない*ようにすべきです。 - ::: -### TypeScript 用の自動補完 +::: + +::: details 変数の逆順展開 -デフォルトで Vite は [`vite/client.d.ts`](https://github.com/vitejs/vite/blob/main/packages/vite/client.d.ts) で `import.meta.env` のための型定義を提供します。`.env.[mode]` ファイルで自前の環境変数を定義できますが、`VITE_` で始まるユーザ定義の環境変数に対する TypeScript の自動補完が欲しくなるかもしれません。 +Vite は変数を逆順で展開することをサポートしています。 +たとえば、以下の `.env` は `VITE_FOO=foobar`、`VITE_BAR=bar` として評価されます。 -この目的を達するには、`src` ディレクトリに `env.d.ts` を作成し、以下のように `ImportMetaEnv` を補ってください: +```[.env] +VITE_FOO=foo${VITE_BAR} +VITE_BAR=bar +``` + +これはシェルスクリプトや `docker-compose` のような他のツールでは動作しません。 +とはいえ、この挙動は `dotenv-expand` によって長い間サポートされてきたものであり、JavaScript エコシステム内の他のツールでは、この挙動をサポートする古いバージョンが使用されているため、Vite はこの挙動をサポートしています。 + +相互運用性の問題を回避するため、この挙動に依存しないことをお勧めします。Vite は将来的にこの挙動に対して警告を発するようになる可能性があります。 + +::: -```typescript -/// +## TypeScript 用の自動補完 + +デフォルトで Vite は [`vite/client.d.ts`](https://github.com/vitejs/vite/blob/main/packages/vite/client.d.ts) で `import.meta.env` のための型定義を提供します。`.env.[mode]` ファイルで自前の環境変数を定義できますが、`VITE_` で始まるユーザー定義の環境変数に対する TypeScript の自動補完が欲しくなるかもしれません。 + +この目的を達するには、`src` ディレクトリーに `vite-env.d.ts` を作成し、以下のように `ImportMetaEnv` を補ってください: + +```typescript [vite-env.d.ts] +interface ViteTypeOptions { + // この行を追加することで ImportMetaEnv の型を厳密にし、不明なキーを許可しないように + // できます。 + // strictImportMetaEnv: unknown +} interface ImportMetaEnv { readonly VITE_APP_TITLE: string @@ -99,22 +133,40 @@ interface ImportMeta { } ``` -コードがブラウザー環境の型、例えば [DOM](https://github.com/microsoft/TypeScript/blob/main/lib/lib.dom.d.ts) や [WebWorker](https://github.com/microsoft/TypeScript/blob/main/lib/lib.webworker.d.ts) に依存している場合は、`tsconfig.json` 内の [lib](https://www.typescriptlang.org/tsconfig#lib) フィールドを更新しましょう。 +コードがブラウザー環境の型、例えば [DOM](https://github.com/microsoft/TypeScript/blob/main/src/lib/dom.generated.d.ts) や [WebWorker](https://github.com/microsoft/TypeScript/blob/main/src/lib/webworker.generated.d.ts) に依存している場合は、`tsconfig.json` 内の [lib](https://www.typescriptlang.org/tsconfig#lib) フィールドを更新しましょう。 -```json +```json [tsconfig.json] { "lib": ["WebWorker"] } ``` -## Modes +:::warning import は型拡張を破壊する -デフォルトで、開発サーバ(`dev` コマンド)は `development` モードで動作し、`build` コマンドは `production` モードで動作します。 +`ImportMetaEnv` の拡張が上手く動かない場合、`import` ステートメントが `vite-env.d.ts` 内に存在しないことを確認してください。詳しい情報については、[TypeScript のドキュメント](https://www.typescriptlang.org/docs/handbook/2/modules.html#how-javascript-modules-are-defined) を参照してください。 -つまり、 `vite build` の動作中は、もし `.env.production` があれば、環境変数をそこから読み込むということです: +::: + +## HTML での定数の置換 +Vite は HTML ファイルでの定数の置換もサポートしています。`import.meta.env` にあるプロパティは、特別な `%CONST_NAME%` 構文を使用して HTML ファイルで使用できます: + +```html +

Vite is running in %MODE%

+

Using data from %VITE_API_URL%

``` -# .env.production + +環境変数が `import.meta.env` に存在しない場合(例: `%NON_EXISTENT%`)、JS では `import.meta.env.NON_EXISTENT` が `undefined` として置換されるのとは異なり、(HTML では)無視されて置換されません。 + +Vite は多くのフレームワークで使用されているため、条件分岐のような複雑な置換については意図的に主張を持たないようにしています。Vite は[既存のユーザーランドプラグイン](https://github.com/vitejs/awesome-vite#transformers)、または [`transformIndexHtml` フック](./api-plugin#transformindexhtml)を実装したカスタムプラグインを使って拡張できます。 + +## モード {#modes} + +デフォルトで、開発サーバー(`dev` コマンド)は `development` モードで動作し、`build` コマンドは `production` モードで動作します。 + +つまり、 `vite build` の動作中は、もし `.env.production` があれば、環境変数をそこから読み込むということです: + +```[.env.production] VITE_APP_TITLE=My App ``` @@ -128,14 +180,44 @@ vite build --mode staging また、`.env.staging` ファイルを作成します: -``` -# .env.staging +```[.env.staging] VITE_APP_TITLE=My App (staging) ``` `vite build` はデフォルトで本番環境のビルドを実行しますが、別のモードと `.env` ファイルの設定を変更することで、開発環境のビルドを実行することもできます: -``` -# .env.testing +```[.env.testing] NODE_ENV=development ``` + +### NODE_ENV とモード + +`NODE_ENV`(`process.env.NODE_ENV`)とモードは異なる概念であると意識するのが重要です。それぞれのコマンドが `NODE_ENV` とモードにどのように影響するかを以下に示します: + +| コマンド | NODE_ENV | モード | +| ---------------------------------------------------- | --------------- | --------------- | +| `vite build` | `"production"` | `"production"` | +| `vite build --mode development` | `"production"` | `"development"` | +| `NODE_ENV=development vite build` | `"development"` | `"production"` | +| `NODE_ENV=development vite build --mode development` | `"development"` | `"development"` | + +`NODE_ENV` およびモードのいろいろな値は、それに対応する `import.meta.env` プロパティにも反映されます: + +| コマンド | `import.meta.env.PROD` | `import.meta.env.DEV` | +| ---------------------- | ---------------------- | --------------------- | +| `NODE_ENV=production` | `true` | `false` | +| `NODE_ENV=development` | `false` | `true` | +| `NODE_ENV=other` | `false` | `true` | + +| コマンド | `import.meta.env.MODE` | +| -------------------- | ---------------------- | +| `--mode production` | `"production"` | +| `--mode development` | `"development"` | +| `--mode staging` | `"staging"` | + +:::tip `.env` ファイル内での `NODE_ENV` + +`NODE_ENV=...` はコマンドや `.env` ファイルで設定できます。`.env.[mode]` ファイルで `NODE_ENV` が指定されている場合、モードを使用してその値を制御できます。ただし、`NODE_ENV` とモードは依然として異なる概念として残ります。 + +コマンドでの `NODE_ENV=...` の主な利点は、Vite がその値を早期に検出できることです。Vite は設定ファイルが評価された後でしか env ファイルを読み込めないので、(コマンドで `NODE_ENV` を指定すると)Vite の設定内で `process.env.NODE_ENV` を読み取ることができます。 +::: diff --git a/guide/features.md b/guide/features.md index 19e513db..071fcce7 100644 --- a/guide/features.md +++ b/guide/features.md @@ -1,8 +1,8 @@ # 特徴 -基本的に、Vite を使用した開発は静的ファイルサーバを使用した時とそれほど変わりません。しかし、Vite はバンドラベースのセットアップで一般的な機能をサポートするためにネイティブ ESM をインポートすることで様々な拡張機能を提供します。 +基本的に、Vite を使用した開発は静的ファイルサーバーを使用した時とそれほど変わりません。しかし、Vite はバンドラーベースのセットアップで一般的な機能をサポートするためにネイティブ ESM をインポートすることで様々な拡張機能を提供します。 -## NPM の依存関係の解決と事前バンドル +## npm の依存関係の解決と事前バンドル ネイティブ ES のインポートは次のような生のモジュールをサポートしていません: @@ -10,19 +10,19 @@ import { someMethod } from 'my-dep' ``` -上のようなコードはブラウザでエラーになります。Vite は提供される全てのソースファイルでこのような生のモジュールのインポートを検出し以下を実行します: +上のようなコードはブラウザーでエラーになります。Vite は提供される全てのソースファイルでこのような生のモジュールのインポートを検出し以下を実行します: -1. [事前バンドル](./dep-pre-bundling) はページの読み込み速度を改善し、CommonJS / UMD モジュールを ESM に変換します。事前バンドルは [esbuild](http://esbuild.github.io/) で実行され、Vite のコールドスタート時間をどんな JavaScript ベースのバンドラよりも大幅に高速にします。 +1. [事前バンドル](./dep-pre-bundling) はページの読み込み速度を改善し、CommonJS / UMD モジュールを ESM に変換します。事前バンドルは [esbuild](http://esbuild.github.io/) で実行され、Vite のコールドスタート時間をどんな JavaScript ベースのバンドラーよりも大幅に高速にします。 -2. インポートを `/node_modules/.vite/deps/my-dep.js?v=f3sf2ebd` のように書き換えることでブラウザが正しくモジュールをインポートできるようにします。 +2. インポートを `/node_modules/.vite/deps/my-dep.js?v=f3sf2ebd` のように書き換えることでブラウザーが正しくモジュールをインポートできるようにします。 **依存関係は積極的にキャッシュされます** -Vite は HTTP ヘッダを介して依存関係のリクエストをキャッシュするため、依存関係をローカルで編集/デバッグする場合は、[ここの手順](./dep-pre-bundling#ブラウザ-キャッシュ)に従ってください。 +Vite は HTTP ヘッダーを介して依存関係のリクエストをキャッシュするため、依存関係をローカルで編集/デバッグする場合は、[ここの手順](./dep-pre-bundling#browser-cache)に従ってください。 ## Hot Module Replacement -Vite はネイティブ ESM を介して [HMR API](./api-hmr) を提供します。HMR 機能を備えたフレームワークは、API を活用して、ページを再読み込みしたり、アプリケーションの状態を損失することなく即座に正確な更新を提供できます。Vite は [Vueの単一ファイルコンポーネント](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue) および [React Fast Refresh](https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react) に対しての HMR 統合を提供します。[@prefresh/vite](https://github.com/JoviDeCroock/prefresh/tree/main/packages/vite) を介した Preact の統合された公式のライブラリもあります。 +Vite はネイティブ ESM を介して [HMR API](./api-hmr) を提供します。HMR 機能を備えたフレームワークは、API を活用して、ページを再読み込みしたり、アプリケーションの状態を損失することなく即座に正確な更新を提供できます。Vite は [Vue の単一ファイルコンポーネント](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue) および [React Fast Refresh](https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react) に対しての HMR 統合を提供します。[@prefresh/vite](https://github.com/JoviDeCroock/prefresh/tree/main/packages/vite) を介した Preact の統合された公式のライブラリーもあります。 これらを手動で設定する必要がないことには注意してください - [`create-vite` を介してアプリケーションを作成する](./)場合、これらはすでに構成されています。 @@ -30,9 +30,19 @@ Vite はネイティブ ESM を介して [HMR API](./api-hmr) を提供します Vite は `.ts` ファイルをインポートすることをサポートしています。 -Vite は `.ts` ファイルに対してトランスパイルをするだけで、型チェックは **実行しません**。型チェックは IDE とビルドの過程にて実行されることを前提としています (ビルドスクリプト内で `tsc --noEmit` を実行するか、`vue-tsc` をインストールして `vue-tsc --noEmit` を実行することで `*.vue` ファイルの型チェックもできます)。 +### トランスパイルのみ -Vite は [esbuild](https://github.com/evanw/esbuild) を用いて TypeScript を JavaScript に変換します。これは、vanilla の `tsc` よりも約 20〜30 倍速く、HMR の更新は 50 ミリ秒未満でブラウザに反映されます +Vite は `.ts` ファイルのトランスパイルを行うだけで、型チェックは**行わない**ことに注意してください。型チェックは IDE やビルドプロセスで行われることを想定しています。 + +Vite が変換処理の一部として型チェックを行わないのは、この 2 つのジョブが根本的に異なる動作をするからです。トランスパイルはファイル単位で行うことができ、Vite のオンデマンドコンパイルモデルと完全に調和しています。これに対して、型チェックはモジュールグラフ全体についての知識が必要です。Vite の変換パイプラインに型チェックを組み込むと、必然的に Vite の利点であるスピードが損なわれてしまいます。 + +Vite の仕事は、ソースモジュールをできるだけ速くブラウザーで実行できる形にすることです。そのため、Vite の変換パイプラインから静的解析チェックを切り離すことをお勧めします。この原則は、ESLint のような他の静的解析チェックにも当てはまります。 + +- プロダクションビルドの場合は、Vite のビルドコマンドに加えて、`tsc --noEmit` を実行できます。 + +- 開発中、IDE のヒント以上が必要な場合は、別プロセスで `tsc --noEmit --watch` を実行するか、型エラーをブラウザーに直接報告させたい場合は [vite-plugin-checker](https://github.com/fi3ework/vite-plugin-checker) を使用することをおすすめします。 + +Vite は [esbuild](https://github.com/evanw/esbuild) を用いて TypeScript を JavaScript に変換します。これは、vanilla の `tsc` よりも約 20〜30 倍速く、HMR の更新は 50 ミリ秒未満でブラウザーに反映されます [型のみのインポートやエクスポート](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)構文を使用すると、型のみのインポートが正しくバンドルされないなどの潜在的な問題を回避できます。例えば: @@ -41,100 +51,187 @@ import type { T } from 'only/types' export type { T } ``` -### TypeScript コンパイラオプション +### TypeScript コンパイラーオプション `tsconfig.json` の `compilerOptions` にあるいくつかの設定フィールドには、特別な注意が必要です。 #### `isolatedModules` +- [TypeScript ドキュメント](https://www.typescriptlang.org/tsconfig#isolatedModules) + `true` に設定する必要があります。 `esbuild` は型情報なしにトランスパイルを行うだけなので、const enum や暗黙の型のみのインポートなどの特定の機能をサポートしていないからです。 隔離されたトランスパイルで動作しない機能を TS が警告するように、`tsconfig.json` の `compilerOptions` で `"isolatedModules": true` を設定する必要があります。 -しかし、一部のライブラリ (例えば [`vue`](https://github.com/vuejs/core/issues/1228)) は `"isolatedModules": true` でうまく動作しないことがあります。`skipLibCheck": true` を使用すると、アップストリームで修正されるまで一時的にエラーを抑制することができます。 +もし依存関係が `"isolatedModules": true` でうまく動作しない場合は、`"skipLibCheck": true` を使用すると、アップストリームで修正されるまで一時的にエラーを抑制できます。 #### `useDefineForClassFields` -Vite 2.5.0 からは、TypeScript ターゲットが `ESNext` か `ES2022` 以上の場合、デフォルト値は `true` になります。これは [`tsc` 4.3.2 以降の動作](https://github.com/microsoft/TypeScript/pull/42663)と一致しています。また、これは ECMAScript の標準的なランタイムの動作でもあります。 +- [TypeScript ドキュメント](https://www.typescriptlang.org/tsconfig#useDefineForClassFields) + +TypeScript ターゲットが `ES2022` 以降(`ESNext` を含む)の場合、デフォルト値は `true` になります。これは [TypeScript 4.3.2 以降の動作](https://github.com/microsoft/TypeScript/pull/42663)と一致しています。 +他の TypeScript ターゲットはデフォルトで `false` になります。 + +`true` は ECMAScript の標準的なランタイムの動作です。 + +クラスフィールドに大きく依存しているライブラリーを使用している場合は、そのライブラリーが意図している使い方に注意してください。 +ほとんどのライブラリーは `"useDefineForClassFields": true` を想定していますが、ライブラリーがサポートしていない場合は、明示的に `useDefineForClassFields` を `false` に設定できます。 + +#### `target` -しかし、他のプログラミング言語や古いバージョンの TypeScript を使用している人にとっては直感的に理解できないかもしれません。 -移行の詳細については、[TypeScript 3.7 リリースノート](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#the-usedefineforclassfields-flag-and-the-declare-property-modifier)を参照してください。 +- [TypeScript ドキュメント](https://www.typescriptlang.org/tsconfig#target) -クラスフィールドに大きく依存しているライブラリを使用している場合は、そのライブラリが意図している使い方に注意してください。 +Vite は `esbuild` と同じ動作に従い、`tsconfig.json` 内の `target` の値を無視します。 -[MobX](https://mobx.js.org/installation.html#use-spec-compliant-transpilation-for-class-properties)、[Vue Class Components 8.x](https://github.com/vuejs/vue-class-component/issues/465) など、ほとんどのライブラリは `"useDefineForClassFields": true` を想定しています。 +開発中に target を指定するには [`esbuild.target`](/config/shared-options.html#esbuild) オプションを使用することができ、トランスパイルを最小限に抑えるためにデフォルトで `esnext` に設定されます。ビルドでは、[`build.target`](/config/build-options.html#build-target) オプションが優先され、必要に応じて設定することができます。 -しかし、[`lit-element`](https://github.com/lit/lit-element/issues/1030) など、まだこの新しいデフォルトに移行していないライブラリもあります。これらの場合は、明示的に `useDefineForClassFields` を `false` に設定してください。 +::: warning `useDefineForClassFields` -### ビルド結果に影響するその他のコンパイラオプション +`tsconfig.json` 内の `target` が `ESNext` または `ES2022` 以降でない場合、または `tsconfig.json` ファイルがない場合、`useDefineForClassFields` のデフォルトは `false` になり、`esbuild.target` のデフォルト値が `esnext` の場合に問題が発生する可能性があります。これは[静的初期化ブロック](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes/Static_initialization_blocks#browser_compatibility)にトランスパイルされる可能性があり、ブラウザーでサポートされていない可能性があります。 + +そのため、`tsconfig.json` を設定する際には、`target` を `ESNext` または `ES2022` 以降に設定するか、`useDefineForClassFields` を明示的に `true` に設定することをおすすめします。 +::: + +### ビルド結果に影響するその他のコンパイラーオプション - [`extends`](https://www.typescriptlang.org/tsconfig#extends) - [`importsNotUsedAsValues`](https://www.typescriptlang.org/tsconfig#importsNotUsedAsValues) - [`preserveValueImports`](https://www.typescriptlang.org/tsconfig#preserveValueImports) +- [`verbatimModuleSyntax`](https://www.typescriptlang.org/tsconfig#verbatimModuleSyntax) +- [`jsx`](https://www.typescriptlang.org/tsconfig#jsx) - [`jsxFactory`](https://www.typescriptlang.org/tsconfig#jsxFactory) - [`jsxFragmentFactory`](https://www.typescriptlang.org/tsconfig#jsxFragmentFactory) +- [`jsxImportSource`](https://www.typescriptlang.org/tsconfig#jsxImportSource) +- [`experimentalDecorators`](https://www.typescriptlang.org/tsconfig#experimentalDecorators) +- [`alwaysStrict`](https://www.typescriptlang.org/tsconfig#alwaysStrict) -もしコードベースを `"isolatedModules": true` に移行することが無理な場合は、[rollup-plugin-friendly-type-imports](https://www.npmjs.com/package/rollup-plugin-friendly-type-imports) のようなサードパーティのプラグインを使って回避できるかも知れません。しかし、この方法は Vite では公式にサポートされていません。 - -### クライアントでの型 - -Vite はデフォルトでは Node.js の API を提供します。Vite でクライアント用のコードを使用するには `d.ts` の定義ファイルを追加します: +::: tip `skipLibCheck` +Vite のスターターテンプレートでは依存関係の型チェックを避けるため、デフォルトで `"skipLibCheck": "true"` となっています。これは TypeScript の特定のバージョンや設定のみをサポートするように選択できるようにするためです。詳しくは [vuejs/vue-cli#5688](https://github.com/vuejs/vue-cli/pull/5688) を参照してください。 +::: -```typescript -/// -``` +### クライアントでの型 {#client-types} -`tsconfig` の `compilerOptions.types` に `vite/client` を追加することもできます: +Vite はデフォルトでは Node.js の API を提供します。Vite でクライアント用のコードを使用するには、`tsconfig.json` 内の `compilerOptions.types` に `vite/client` を追加できます: -```json +```json [tsconfig.json] { "compilerOptions": { - "types": ["vite/client"] + "types": ["vite/client", "some-other-global-lib"] } } ``` -これにより次のことが提供されます: +[`compilerOptions.types`](https://www.typescriptlang.org/tsconfig#types) が指定された場合、グローバルスコープには(見つかるすべての "@types" パッケージの代わりに)これらのパッケージのみが含まれるようになることに注意してください。これは TS 5.9 以降で推奨されています。 + +::: details triple-slash directive の使用 -- アセットのインポート (例: `.svg` ファイルのインポート) -- `import.meta.env` に Vite が挿入した [env variables](./env-and-mode#env-variables) の型 +または、`d.ts` の定義ファイルを追加することもできます: + +```typescript [vite-env.d.ts] +/// +``` + +::: + +`vite/client` は以下の型のシム(shim)を提供します: + +- アセットのインポート(例: `.svg` ファイルのインポート) +- `import.meta.env` に Vite が挿入した[定数](./env-and-mode#env-variables)の型 - `import.meta.hot` の [HMR API](./api-hmr) の型 ::: tip -デフォルトの型定義を上書きするためには、triple-slash reference の前に型を宣言します。例えば、`*.svg` のデフォルトインポートを React コンポーネントにする場合: +デフォルトの型を上書きするためには、自身の型を含む型定義ファイルを追加します。その後、`vite/client` の前に型参照を追加してください。 -```ts -declare module '*.svg' { - const content: React.FC> - export default content -} +例えば、`*.svg` のデフォルトインポートを React コンポーネントにする場合: -/// -``` +- `vite-env-override.d.ts`(自身の型を含むファイル): + ```ts + declare module '*.svg' { + const content: React.FC> + export default content + } + ``` +- `compilerOptions.types` を使用している場合は、ファイルが `tsconfig.json` に含まれるようにします: + ```json [tsconfig.json] + { + "include": ["src", "./vite-env-override.d.ts"] + } + ``` +- triple-slash directive を使用している場合は、`vite/client` への参照を含むファイル(通常は `vite-env.d.ts`)を更新します: + ```ts + /// + /// + ``` ::: -## Vue +## HTML + +HTML ファイルは、Vite プロジェクトの[中心](/guide/#index-html-and-project-root)に位置し、アプリケーションのエントリーポイントとして機能し、シングルページアプリケーションおよび[マルチページアプリケーション](/guide/build.html#multi-page-app)の構築をシンプルにします。 + +プロジェクトルート内の HTML ファイルは、それぞれのディレクトリパスで直接アクセスできます: + +- `/index.html` -> `http://localhost:5173/` +- `/about.html` -> `http://localhost:5173/about.html` +- `/blog/index.html` -> `http://localhost:5173/blog/index.html` + +` + + +``` + +特定の要素の HTML 処理をオプトアウトするには、その要素に `vite-ignore` 属性を追加します。これは、外部アセットや CDN を参照する際に便利です。 + +## フレームワーク + +すべてのモダンなフレームワークは Vite とのインテグレーションをメンテナンスしています。ほとんどのフレームワークのプラグインは各フレームワークのチームがメンテナンスしていますが、公式の Vue と React の Vite プラグインは例外として Vite の organization によりメンテナンスされています。 + +- Vue のサポート: [@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue) +- Vue JSX のサポート: [@vitejs/plugin-vue-jsx](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue-jsx) +- React のサポート: [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react) +- SWC を利用している React のサポート: [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react-swc) +- [React サーバーコンポーネント(RSC)](https://react.dev/reference/rsc/server-components)のサポート: [@vitejs/plugin-rsc](https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-rsc) -- Vue 3 SFC はこちら [@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue) -- Vue 3 JSX はこちら [@vitejs/plugin-vue-jsx](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue-jsx) -- Vue 2.7 はこちら [@vitejs/plugin-vue2](https://github.com/vitejs/vite-plugin-vue2) -- Vue <2.7 はこちら [vite-plugin-vue2](https://github.com/underfin/vite-plugin-vue2) +詳しくは[プラグインガイド](/plugins/)を確認してください。 ## JSX `.jsx` と `.tsx` も標準サポートされます。JSX のトランスパイルも [esbuild](https://esbuild.github.io) を介して行われます。 -Vue を使用している人は公式の [@vitejs/plugin-vue-jsx](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue-jsx) プラグインを使用するべきです。これは、HMR、グローバルコンポーネント解決、ディレクティブ、スロットなど、Vue 3 の固有の機能を提供します。 +選択したフレームワークでは、すでに最初から JSX が設定されているはずです(たとえば、Vue を使用している人は公式の [@vitejs/plugin-vue-jsx](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue-jsx) プラグインを使用するべきです。これは、HMR、グローバルコンポーネント解決、ディレクティブ、スロットなど、Vue 3 の固有の機能を提供します)。 -もし React、または Vue で JSX を使用していない場合は、[`esbuild` オプション](/config/shared-options.md#esbuild) を使用して `jsxFactory` および `jsxFragment` を構成することができます。例えば、Preact の場合: +自分自身のフレームワークで JSX を使用している場合は、[`esbuild` オプション](/config/shared-options.md#esbuild) を使用してカスタムの `jsxFactory` および `jsxFragment` を設定できます。例えば、Preact プラグインは以下のような設定を利用します: -```js -// vite.config.js +```js twoslash [vite.config.js] import { defineConfig } from 'vite' export default defineConfig({ @@ -147,10 +244,9 @@ export default defineConfig({ さらに詳しく知りたい場合は [esbuild docs](https://esbuild.github.io/content-types/#jsx) を見てください。 -また、`jsxInject`(Vite のみのオプション)を使用して JSX ヘルパを挿入し、手動インポートを回避できます。 +また、`jsxInject`(Vite のみのオプション)を使用して JSX ヘルパーを挿入し、手動インポートを回避できます。 -```js -// vite.config.js +```js twoslash [vite.config.js] import { defineConfig } from 'vite' export default defineConfig({ @@ -162,17 +258,17 @@ export default defineConfig({ ## CSS -`.css` ファイルをインポートすると、HMR をサポートする `Vite Dev ServerVite Dev ServerBrowser  +EnvironmentBrowser  +EnvironmentNode  +EnvironmentNode  +EnvironmentBrowser  +RuntimeBrowser  +RuntimeWorkerd  + RuntimeWorkerd  + RuntimeWorkerd  +EnvironmentWorkerd  +EnvironmentNode  +RuntimeNode  +RuntimeBrowser  +Module  +RunnerBrowser  +Module  +RunnerNode  +Module  +RunnerNode  +Module  +RunnerWorkerd  +Module  +RunnerWorkerd  +Module  +RunnerVitest JSDOM  +EnvironmentVitest JSDOM  +EnvironmentWorker  +Thread  +Module  +RunnerWorker  +Thread  +Module  +RunnerHTTP ServerHTTP ServerMiddlewaresMiddlewaresPlugins PipelinePlugins PipelineWeb SocketWeb Socket \ No newline at end of file diff --git a/images/vite-plugin-inspect.png b/images/vite-plugin-inspect.png deleted file mode 100644 index 0a8b2723..00000000 Binary files a/images/vite-plugin-inspect.png and /dev/null differ diff --git a/images/vite-plugin-inspect.webp b/images/vite-plugin-inspect.webp new file mode 100644 index 00000000..dbb0460a Binary files /dev/null and b/images/vite-plugin-inspect.webp differ diff --git a/images/vite4-3-hmr-time.webp b/images/vite4-3-hmr-time.webp new file mode 100644 index 00000000..b561023b Binary files /dev/null and b/images/vite4-3-hmr-time.webp differ diff --git a/images/vite4-3-startup-time.webp b/images/vite4-3-startup-time.webp new file mode 100644 index 00000000..37837c99 Binary files /dev/null and b/images/vite4-3-startup-time.webp differ diff --git a/images/vite5-1-10K-modules-loading-time.webp b/images/vite5-1-10K-modules-loading-time.webp new file mode 100644 index 00000000..5dc6f54c Binary files /dev/null and b/images/vite5-1-10K-modules-loading-time.webp differ diff --git a/images/vite6-npm-weekly-downloads.webp b/images/vite6-npm-weekly-downloads.webp new file mode 100644 index 00000000..2112a3e8 Binary files /dev/null and b/images/vite6-npm-weekly-downloads.webp differ diff --git a/images/viteconf.svg b/images/viteconf.svg new file mode 100644 index 00000000..2ca20c23 --- /dev/null +++ b/images/viteconf.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/voice.svg b/images/voice.svg similarity index 100% rename from public/voice.svg rename to images/voice.svg diff --git a/index.md b/index.md index 9f45fbd0..f4779b94 100644 --- a/index.md +++ b/index.md @@ -1,44 +1,62 @@ --- -layout: home - title: Vite titleTemplate: 次世代フロントエンドツール +# add `dark` here to apply dark mode on initial load, +# since `onMounted` doesn't run during SSR +pageClass: landing dark -hero: - name: Vite - text: 次世代フロントエンドツール - tagline: 最先端をいく開発環境を構築しましょう - image: - src: /logo-with-shadow.png - alt: Vite - actions: - - theme: brand - text: Vite を始める - link: /guide/ - - theme: alt - text: なぜ Vite なのか? - link: /guide/why - - theme: alt - text: GitHub で見る - link: https://github.com/vitejs/vite - -features: - - icon: 💡 - title: 瞬時にスタートするサーバ - details: ネイティブ ESM により要求時にファイルが提供されるため、バンドルが不要です! - - icon: ⚡️ - title: 超高速な HMR - details: アプリのサイズに関係なく高速を維持する HMR を提供します。 - - icon: 🛠️ - title: 豊富な機能 - details: TypeScript、JSX、CSS などがすぐに使えるようにサポートされています。 - - icon: 📦 - title: 最適化されたビルド - details: 設定済みの Rollup によるビルドによってマルチページおよびライブラリモードをサポートします。 - - icon: 🔩 - title: ユニバーサルなプラグイン - details: 開発とビルドの間で共有される Rollup と互換性のあるプラグインを提供します。 - - icon: 🔑 - title: 完全に型定義がされている API - details: 完全な TypeScript の型定義を備えた柔軟なプログラミング志向の API です。 +layout: home +aside: false +editLink: false +markdownStyles: false --- + + + +
+ + + + + + + + + + + + + + + + + +
diff --git a/netlify.toml b/netlify.toml index 22e33535..8e03644f 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,2 +1,2 @@ [build.environment] - NODE_VERSION = "16" + NODE_VERSION = "22" diff --git a/package.json b/package.json index b289339d..8ac5595d 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,33 @@ { "private": true, + "type": "module", "scripts": { + "typecheck": "vue-tsc", "docs": "vitepress dev", "build-docs": "vitepress build", "serve-docs": "vitepress serve", - "test": "npm run lint", - "lint": "textlint --format pretty-error **/*.md" + "lint": "textlint --format pretty-error \"**/*.md\"" }, "devDependencies": { - "@types/node": "^18.6.3", - "lint-staged": "^11.1.1", - "textlint": "^12.0.2", + "@shikijs/vitepress-twoslash": "^3.13.0", + "@type-challenges/utils": "^0.1.1", + "@types/express": "^5.0.3", + "@types/node": "^22.18.8", + "feed": "^5.1.0", + "gsap": "^3.13.0", + "lint-staged": "^16.2.3", + "markdown-it-image-size": "^15.0.1", + "textlint": "^13.4.1", "textlint-filter-rule-allowlist": "^4.0.0", + "textlint-filter-rule-comments": "^1.2.2", "textlint-rule-preset-vuejs-jp": "git+https://github.com/vuejs-jp/textlint-rule-preset-vuejs-jp.git", - "vitepress": "^1.0.0-alpha.4", + "typescript": "~5.9.2", + "vite": "^7.1.5", + "vitepress": "^2.0.0-alpha.12", + "vitepress-plugin-group-icons": "^1.6.3", + "vitepress-plugin-llms": "^1.8.0", + "vue": "^3.5.22", + "vue-tsc": "^3.1.0", "yorkie": "^2.0.0" }, "gitHooks": { @@ -21,5 +35,12 @@ }, "lint-staged": { "*.md": "textlint --format pretty-error" + }, + "packageManager": "pnpm@10.18.0", + "pnpm": { + "onlyBuiltDependencies": [ + "esbuild", + "yorkie" + ] } } diff --git a/plugins/index.md b/plugins/index.md index a7eed36f..c8b012d6 100644 --- a/plugins/index.md +++ b/plugins/index.md @@ -10,28 +10,38 @@ Vite は、一般的な Web 開発パターンをすぐに使えるようにサ ### [@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue) -- Vue 3 の単一ファイルコンポーネントのサポートを提供します。 +Vue 3 の単一ファイルコンポーネントのサポートを提供します。 ### [@vitejs/plugin-vue-jsx](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue-jsx) -- Vue 3 の JSX([専用の Babel transform](https://github.com/vuejs/jsx-next) を介して)のサポートを提供します。 +Vue 3 の JSX([専用の Babel transform](https://github.com/vuejs/babel-plugin-jsx) を介して)のサポートを提供します。 ### [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react) -- esbuild と Babel を使用し、小さなパッケージフットプリントで高速な HMR や、Babel 変換パイプラインを使用できる柔軟性を実現します。 +esbuild と Babel を使用し、小さなパッケージフットプリントで高速な HMR や、Babel 変換パイプラインを使用できる柔軟性を実現します。Babel プラグインを追加しない場合、ビルド時には esbuild のみが使用されます。 -### [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) +### [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react-swc) -- ビルド時は esbuild を使用し、開発中は Babel を SWC に置き換えます。非標準の React 拡張を必要としない大きなプロジェクトでは、コールドスタートやホットモジュールリプレースメント(HMR)が大幅に高速化されます。 +開発中は Babel を SWC に置き換えます。プロダクションビルド時には、プラグインを使用する場合は SWC+esbuild、それ以外は esbuild を使用します。非標準の React 拡張を必要としない大きなプロジェクトでは、コールドスタートやホットモジュールリプレースメント(HMR)が大幅に高速化されます。 + +### [@vitejs/plugin-rsc](https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-rsc) + +Vite はこのプラグインを通して [React サーバーコンポーネント(RSC)](https://react.dev/reference/rsc/server-components)をサポートしています。このプラグインは、React フレームワークが RSC 機能を統合するために使用できる低レベルのプリミティブを提供する [Environment API](/guide/api-environment) を利用しています。以下を実行してミニマルなスタンドアロン RSC アプリケーションを試すことができます: + +```bash +npm create vite@latest -- --template rsc +``` + +詳しくは [プラグインドキュメント](https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-rsc) をお読みください。 ### [@vitejs/plugin-legacy](https://github.com/vitejs/vite/tree/main/packages/plugin-legacy) -- 本番環境向けにレガシーブラウザのサポートを提供します。 +本番環境向けにレガシーブラウザーのサポートを提供します。 -## コミュニティプラグイン +## コミュニティープラグイン [awesome-vite](https://github.com/vitejs/awesome-vite#plugins) を確認してみてください - あなたのプラグインを掲載するために PR を出すこともできます。 ## Rollup プラグイン -[Vite プラグイン](../guide/api-plugin) は、Rollup プラグインのインタフェイスを拡張したものです。 [Rollup プラグインとの互換性セクション](../guide/api-plugin#rollup-プラグインの互換性) に詳しい情報があります。 +[Vite プラグイン](../guide/api-plugin) は、Rollup プラグインのインターフェイスを拡張したものです。 [Rollup プラグインとの互換性セクション](../guide/api-plugin#rollup-plugin-compatibility) に詳しい情報があります。 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..316b108f --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5954 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@shikijs/vitepress-twoslash': + specifier: ^3.13.0 + version: 3.13.0(typescript@5.9.2) + '@type-challenges/utils': + specifier: ^0.1.1 + version: 0.1.1 + '@types/express': + specifier: ^5.0.3 + version: 5.0.3 + '@types/node': + specifier: ^22.18.8 + version: 22.18.8 + feed: + specifier: ^5.1.0 + version: 5.1.0 + gsap: + specifier: ^3.13.0 + version: 3.13.0 + lint-staged: + specifier: ^16.2.3 + version: 16.2.3 + markdown-it-image-size: + specifier: ^15.0.1 + version: 15.0.1(markdown-it@14.1.0) + textlint: + specifier: ^13.4.1 + version: 13.4.1 + textlint-filter-rule-allowlist: + specifier: ^4.0.0 + version: 4.0.0(textlint@13.4.1) + textlint-filter-rule-comments: + specifier: ^1.2.2 + version: 1.2.2(textlint@13.4.1) + textlint-rule-preset-vuejs-jp: + specifier: git+https://github.com/vuejs-jp/textlint-rule-preset-vuejs-jp.git + version: https://codeload.github.com/vuejs-jp/textlint-rule-preset-vuejs-jp/tar.gz/d62d64c25aed61a5f7455028b31aca7640181a13(textlint@13.4.1) + typescript: + specifier: ~5.9.2 + version: 5.9.2 + vite: + specifier: ^7.1.5 + version: 7.1.5(@types/node@22.18.8)(yaml@2.8.1) + vitepress: + specifier: ^2.0.0-alpha.12 + version: 2.0.0-alpha.12(@types/node@22.18.8)(postcss@8.5.6)(typescript@5.9.2)(yaml@2.8.1) + vitepress-plugin-group-icons: + specifier: ^1.6.3 + version: 1.6.3(markdown-it@14.1.0)(vite@7.1.5(@types/node@22.18.8)(yaml@2.8.1)) + vitepress-plugin-llms: + specifier: ^1.8.0 + version: 1.8.0 + vue: + specifier: ^3.5.22 + version: 3.5.22(typescript@5.9.2) + vue-tsc: + specifier: ^3.1.0 + version: 3.1.0(typescript@5.9.2) + yorkie: + specifier: ^2.0.0 + version: 2.0.0 + +packages: + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@antfu/utils@9.2.0': + resolution: {integrity: sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==} + + '@azu/format-text@1.0.2': + resolution: {integrity: sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==} + + '@azu/style-format@1.0.1': + resolution: {integrity: sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.3': + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@cacheable/memoize@2.0.3': + resolution: {integrity: sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw==} + + '@cacheable/memory@2.0.3': + resolution: {integrity: sha512-R3UKy/CKOyb1LZG/VRCTMcpiMDyLH7SH3JrraRdK6kf3GweWCOU3sgvE13W3TiDRbxnDKylzKJvhUAvWl9LQOA==} + + '@cacheable/utils@2.0.3': + resolution: {integrity: sha512-m7Rce68cMHlAUjvWBy9Ru1Nmw5gU0SjGGtQDdhpe6E0xnbcvrIY0Epy//JU1VYYBUTzrG9jvgmTauULGKzOkWA==} + + '@docsearch/css@4.0.0-beta.7': + resolution: {integrity: sha512-hBIwf14yLasrUcDNS7jrneM1ibFD/JFJVDjdxd1h/LUHx7eyLrS726pKHVr3cTdToNXP/7jrTbnC1MAuDHPoow==} + + '@docsearch/js@4.0.0-beta.7': + resolution: {integrity: sha512-0RJALbDpLMuFy3H/26rjms/qwi5KjsGMN8Lu4k/bs6kBfOWHUN6Dzg/ybj8qB2OLdT2UegsavRIDZKW3QrzQ4Q==} + + '@esbuild/aix-ppc64@0.25.1': + resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.1': + resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.1': + resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.1': + resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.1': + resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.1': + resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.1': + resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.1': + resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.1': + resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.1': + resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.1': + resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.1': + resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.1': + resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.1': + resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.1': + resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.1': + resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.1': + resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.1': + resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.1': + resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.1': + resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.1': + resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.1': + resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.1': + resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.1': + resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.1': + resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.6.2': + resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + + '@floating-ui/dom@1.1.1': + resolution: {integrity: sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==} + + '@floating-ui/utils@0.2.2': + resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + + '@iconify-json/logos@1.2.4': + resolution: {integrity: sha512-XC4If5D/hbaZvUkTV8iaZuGlQCyG6CNOlaAaJaGa13V5QMYwYjgtKk3vPP8wz3wtTVNVEVk3LRx1fOJz+YnSMw==} + + '@iconify-json/simple-icons@1.2.47': + resolution: {integrity: sha512-wa/2O7G4sBmwSEWWLh5C+HeY00lVOoWYRKJOYQtk7lAbQrHUReD1ijiGOyTynV1YavxtNueL1CBA1UZmYJfOrQ==} + + '@iconify-json/vscode-icons@1.2.29': + resolution: {integrity: sha512-ByqO3YPYs0n7hakQ/ZUXltJQnYibeOv41H1AdciOs7Pmba5/OsKKK1/oOjcBmvXrYuENO+IvIzORYkl6sFXgqA==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.0.1': + resolution: {integrity: sha512-A78CUEnFGX8I/WlILxJCuIJXloL0j/OJ9PSchPAfCargEIKmUBWvvEMmKWB5oONwiUqlNt+5eRufdkLxeHIWYw==} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@keyv/bigmap@1.0.2': + resolution: {integrity: sha512-KR03xkEZlAZNF4IxXgVXb+uNIVNvwdh8UwI0cnc7WI6a+aQcDp8GL80qVfeB4E5NpsKJzou5jU0r6yLSSbMOtA==} + engines: {node: '>= 18'} + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + + '@rolldown/pluginutils@1.0.0-beta.29': + resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} + + '@rollup/rollup-android-arm-eabi@4.46.2': + resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.46.2': + resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.46.2': + resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.46.2': + resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.46.2': + resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.46.2': + resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.46.2': + resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.46.2': + resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.46.2': + resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.46.2': + resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.46.2': + resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.46.2': + resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.46.2': + resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.46.2': + resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.46.2': + resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.46.2': + resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.46.2': + resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.46.2': + resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} + cpu: [x64] + os: [win32] + + '@shikijs/core@3.13.0': + resolution: {integrity: sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==} + + '@shikijs/core@3.9.2': + resolution: {integrity: sha512-3q/mzmw09B2B6PgFNeiaN8pkNOixWS726IHmJEpjDAcneDPMQmUg2cweT9cWXY4XcyQS3i6mOOUgQz9RRUP6HA==} + + '@shikijs/engine-javascript@3.13.0': + resolution: {integrity: sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg==} + + '@shikijs/engine-javascript@3.9.2': + resolution: {integrity: sha512-kUTRVKPsB/28H5Ko6qEsyudBiWEDLst+Sfi+hwr59E0GLHV0h8RfgbQU7fdN5Lt9A8R1ulRiZyTvAizkROjwDA==} + + '@shikijs/engine-oniguruma@3.13.0': + resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} + + '@shikijs/engine-oniguruma@3.9.2': + resolution: {integrity: sha512-Vn/w5oyQ6TUgTVDIC/BrpXwIlfK6V6kGWDVVz2eRkF2v13YoENUvaNwxMsQU/t6oCuZKzqp9vqtEtEzKl9VegA==} + + '@shikijs/langs@3.13.0': + resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} + + '@shikijs/langs@3.9.2': + resolution: {integrity: sha512-X1Q6wRRQXY7HqAuX3I8WjMscjeGjqXCg/Sve7J2GWFORXkSrXud23UECqTBIdCSNKJioFtmUGJQNKtlMMZMn0w==} + + '@shikijs/themes@3.13.0': + resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} + + '@shikijs/themes@3.9.2': + resolution: {integrity: sha512-6z5lBPBMRfLyyEsgf6uJDHPa6NAGVzFJqH4EAZ+03+7sedYir2yJBRu2uPZOKmj43GyhVHWHvyduLDAwJQfDjA==} + + '@shikijs/transformers@3.9.2': + resolution: {integrity: sha512-MW5hT4TyUp6bNAgTExRYLk1NNasVQMTCw1kgbxHcEC0O5cbepPWaB+1k+JzW9r3SP2/R8kiens8/3E6hGKfgsA==} + + '@shikijs/twoslash@3.13.0': + resolution: {integrity: sha512-OmNKNoZ8Hevt4VKQHfJL+hrsrqLSnW/Nz7RMutuBqXBCIYZWk80HnF9pcXEwRmy9MN0MGRmZCW2rDDP8K7Bxkw==} + peerDependencies: + typescript: '>=5.5.0' + + '@shikijs/types@3.13.0': + resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} + + '@shikijs/types@3.9.2': + resolution: {integrity: sha512-/M5L0Uc2ljyn2jKvj4Yiah7ow/W+DJSglVafvWAJ/b8AZDeeRAdMu3c2riDzB7N42VD+jSnWxeP9AKtd4TfYVw==} + + '@shikijs/vitepress-twoslash@3.13.0': + resolution: {integrity: sha512-YwL/Wsyl1Vfg9wcWFJbpqKn7vySaCKNsSxYL3v5J/z+7Qm+fu15JXrtqEJbT8h/STWeaO7pnR6npgoPQEj8Ewg==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@textlint-rule/textlint-rule-no-invalid-control-character@2.0.0': + resolution: {integrity: sha512-EmTC9mrmI5tm9AS+/jv46CzQVycdPjAvH5sk0DjjYCXYNv2oTWk+7naAyKJ3kKQlLzG4KHmX/JDHerVF2T6S2Q==} + + '@textlint/ast-node-types@12.6.1': + resolution: {integrity: sha512-uzlJ+ZsCAyJm+lBi7j0UeBbj+Oy6w/VWoGJ3iHRHE5eZ8Z4iK66mq+PG/spupmbllLtz77OJbY89BYqgFyjXmA==} + + '@textlint/ast-node-types@13.4.1': + resolution: {integrity: sha512-qrZyhCh8Ekk6nwArx3BROybm9BnX6vF7VcZbijetV/OM3yfS4rTYhoMWISmhVEP2H2re0CtWEyMl/XF+WdvVLQ==} + + '@textlint/ast-tester@13.4.1': + resolution: {integrity: sha512-YSHUR1qDgMPGF5+nvrquEhif6zRJ667xUnfP/9rTNtThIhoTQINvczr5/7xa43F1PDWplL6Curw+2jrE1qHwGQ==} + + '@textlint/ast-traverse@13.4.1': + resolution: {integrity: sha512-uucuC7+NHWkXx2TX5vuyreuHeb+GFiA83V65I+FnYP5EC4dAMOQ86rTSPrZmCwLz+qIWgfDgihGzPccpj3EZGg==} + + '@textlint/config-loader@13.4.1': + resolution: {integrity: sha512-ggh6her5PdgcEsvgm3FfCY2+r7IhoQoBTGYxM+IbfkwyVoSoQ2CrXbCVlQkpLPFzhHVbIwgNxkiMr1o2npwfJQ==} + + '@textlint/feature-flag@13.4.1': + resolution: {integrity: sha512-qY8gKUf30XtzWMTkwYeKytCo6KPx6milpz8YZhuRsEPjT/5iNdakJp5USWDQWDrwbQf7RbRncQdU+LX5JbM9YA==} + + '@textlint/fixer-formatter@13.4.1': + resolution: {integrity: sha512-P195Soyxmzv7S5QyCJIjuDXl5t3EyOhYwxR4ukKBZ7bw5hp/P1+e4GEhzqrXWx3z7h0nZZ0TuTjepNxOMo6cAQ==} + + '@textlint/get-config-base-dir@2.0.0': + resolution: {integrity: sha512-J3cG1pl2llYD4ZaZMe0qVgVaHT8RvT+/SW1FHQ8HRceNalMM9O0Y8iIgtl4GGOx4vMghoIPKFVLASw8P8bJ3ZA==} + + '@textlint/kernel@13.4.1': + resolution: {integrity: sha512-r2sUhjPysFjl2Ax37x9AfWkJM8jgKN0bL4SX3xRzOukdcj69Dst5On5qBZtULaVMX1LDkwkdxA6ZEADmq27qQA==} + + '@textlint/linter-formatter@13.4.1': + resolution: {integrity: sha512-VDLnyHRO9hf6CGxMJLM5oi7NH9s0mqiWxtgi95nuXmJZWbQLZVfcxkD1Cp16pwk8zTvlbyMZFqamFCYZyD9Sww==} + + '@textlint/markdown-to-ast@13.4.1': + resolution: {integrity: sha512-jUa5bTNmxjEgfCXW4xfn7eSJqzUXyNKiIDWLKtI4MUKRNhT3adEaa/NuQl0Mii3Hu3HraZR7hYhRHLh+eeM43w==} + + '@textlint/module-interop@12.6.1': + resolution: {integrity: sha512-COyRctLVh2ktAObmht3aNtqUvP0quoellKu1c2RrXny1po+Mf7PkvEKIxphtArE4JXMAmu01cDxfH6X88+eYIg==} + + '@textlint/module-interop@13.4.1': + resolution: {integrity: sha512-keM5zHwyifijEDqEvAFhhXHC5UbmZjfGytRJzPPJaW3C3UsGbIzDCnfOSE9jUVTWZcngHuSJ7aKGv42Rhy9nEg==} + + '@textlint/regexp-string-matcher@1.1.1': + resolution: {integrity: sha512-rrNUCKGKYBrZALotSF8D5A8xD05VHX6kxv0BP805Ig2M73Ha6LK+de31+ZocGm4CO+sikVFYyMCPPJhp7bCXcw==} + + '@textlint/regexp-string-matcher@2.0.2': + resolution: {integrity: sha512-OXLD9XRxMhd3S0LWuPHpiARQOI7z9tCOs0FsynccW2lmyZzHHFJ9/eR6kuK9xF459Qf+740qI5h+/0cx+NljzA==} + + '@textlint/source-code-fixer@13.4.1': + resolution: {integrity: sha512-Sl29f3Tpimp0uVE3ysyJBjxaFTVYLOXiJX14eWCQ/kC5ZhIXGosEbStzkP1n8Urso1rs1W4p/2UemVAm3NH2ng==} + + '@textlint/text-to-ast@13.4.1': + resolution: {integrity: sha512-vCA7uMmbjRv06sEHPbwxTV5iS8OQedC5s7qwmXnWAn2LLWxg4Yp98mONPS1o4D5cPomzYyKNCSfbLwu6yJBUQA==} + + '@textlint/textlint-plugin-markdown@13.4.1': + resolution: {integrity: sha512-OcLkFKYmbYeGJ0kj2487qcicCYTiE2vJLwfPcUDJrNoMYak5JtvHJfWffck8gON2mEM00DPkHH0UdxZpFjDfeg==} + + '@textlint/textlint-plugin-text@13.4.1': + resolution: {integrity: sha512-z0p5B8WUfTCIRmhjVHFfJv719oIElDDKWOIZei4CyYkfMGo0kq8fkrYBkUR6VZ6gofHwc+mwmIABdUf1rDHzYA==} + + '@textlint/types@13.4.1': + resolution: {integrity: sha512-1ApwQa31sFmiJeJ5yTNFqjbb2D1ICZvIDW0tFSM0OtmQCSDFNcKD3YrrwDBgSokZ6gWQq/FpNjlhi6iETUWt0Q==} + + '@textlint/utils@13.4.1': + resolution: {integrity: sha512-wX8RT1ejHAPTDmqlzngf0zI5kYoe3QvGDcj+skoTxSv+m/wOs/NyEr92d+ahCP32YqFYzXlqU7aDx2FkULKT+g==} + + '@type-challenges/utils@0.1.1': + resolution: {integrity: sha512-A7ljYfBM+FLw+NDyuYvGBJiCEV9c0lPWEAdzfOAkb3JFqfLl0Iv/WhWMMARHiRKlmmiD1g8gz/507yVvHdQUYA==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@5.0.6': + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + + '@types/express@5.0.3': + resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@22.18.8': + resolution: {integrity: sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==} + + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@types/unist@3.0.2': + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@typescript/vfs@1.6.1': + resolution: {integrity: sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==} + peerDependencies: + typescript: '*' + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitejs/plugin-vue@6.0.1': + resolution: {integrity: sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.23': + resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} + + '@volar/source-map@2.4.23': + resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==} + + '@volar/typescript@2.4.23': + resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==} + + '@vue/compiler-core@3.5.21': + resolution: {integrity: sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==} + + '@vue/compiler-core@3.5.22': + resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} + + '@vue/compiler-dom@3.5.21': + resolution: {integrity: sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==} + + '@vue/compiler-dom@3.5.22': + resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==} + + '@vue/compiler-sfc@3.5.22': + resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==} + + '@vue/compiler-ssr@3.5.22': + resolution: {integrity: sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/devtools-api@8.0.0': + resolution: {integrity: sha512-I2jF/knesMU36zTw1hnExjoixDZvDoantiWKVrHpLd2J160zqqe8vp3vrGfjWdfuHmPJwSXe/YNG3rYOYiwy1Q==} + + '@vue/devtools-kit@8.0.0': + resolution: {integrity: sha512-b11OeQODkE0bctdT0RhL684pEV2DPXJ80bjpywVCbFn1PxuL3bmMPDoJKjbMnnoWbrnUYXYzFfmMWBZAMhORkQ==} + + '@vue/devtools-shared@8.0.0': + resolution: {integrity: sha512-jrKnbjshQCiOAJanoeJjTU7WaCg0Dz2BUal6SaR6VM/P3hiFdX5Q6Pxl73ZMnrhCxNK9nAg5hvvRGqs+6dtU1g==} + + '@vue/language-core@3.0.7': + resolution: {integrity: sha512-0sqqyqJ0Gn33JH3TdIsZLCZZ8Gr4kwlg8iYOnOrDDkJKSjFurlQY/bEFQx5zs7SX2C/bjMkmPYq/NiyY1fTOkw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/language-core@3.1.0': + resolution: {integrity: sha512-a7ns+X9vTbdmk7QLrvnZs8s4E1wwtxG/sELzr6F2j4pU+r/OoAv6jJGSz+5tVTU6e4+3rjepGhSP8jDmBBcb3w==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.22': + resolution: {integrity: sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==} + + '@vue/runtime-core@3.5.22': + resolution: {integrity: sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==} + + '@vue/runtime-dom@3.5.22': + resolution: {integrity: sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==} + + '@vue/server-renderer@3.5.22': + resolution: {integrity: sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==} + peerDependencies: + vue: 3.5.22 + + '@vue/shared@3.5.18': + resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} + + '@vue/shared@3.5.21': + resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} + + '@vue/shared@3.5.22': + resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} + + '@vueuse/core@13.6.0': + resolution: {integrity: sha512-DJbD5fV86muVmBgS9QQPddVX7d9hWYswzlf4bIyUD2dj8GC46R1uNClZhVAmsdVts4xb2jwp1PbpuiA50Qee1A==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/integrations@13.6.0': + resolution: {integrity: sha512-dVFdgwYvkYjdizRL3ESdUW+Hg84i9Yhuzs+Ec3kEcuzJmT5xhiL/IGdw4z394qSBngUQvFi+wbHwhHX3EGbAxQ==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 || ^8 + vue: ^3.5.0 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@13.6.0': + resolution: {integrity: sha512-rnIH7JvU7NjrpexTsl2Iwv0V0yAx9cw7+clymjKuLSXG0QMcLD0LDgdNmXic+qL0SGvgSVPEpM9IDO/wqo1vkQ==} + + '@vueuse/shared@13.6.0': + resolution: {integrity: sha512-pDykCSoS2T3fsQrYqf9SyF0QXWHmcGPQ+qiOVjlYSzlWd9dgppB2bFSM1GgKKkt7uzn0BBMV3IbJsUfHG2+BCg==} + peerDependencies: + vue: ^3.5.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + + alien-signals@2.0.5: + resolution: {integrity: sha512-PdJB6+06nUNAClInE3Dweq7/2xVAYM64vvvS1IHVHSJmgeOtEdrAGyp7Z2oJtYm0B342/Exd2NT0uMJaThcjLQ==} + + alien-signals@3.0.0: + resolution: {integrity: sha512-JHoRJf18Y6HN4/KZALr3iU+0vW9LKG+8FMThQlbn4+gv8utsLIkwpomjElGPccGeNwh0FI2HN6BLnyFLo6OyLQ==} + + analyze-desumasu-dearu@2.1.5: + resolution: {integrity: sha512-4YPL7IRAuaZflE10+BVhKr6k5KQl/DiLeNCIF7ISqKr0ogM2hqm9ztRNCPqL/xYDI7hfuIHR8T+U7mIDRLQNXw==} + + analyze-desumasu-dearu@5.0.1: + resolution: {integrity: sha512-r7ruCOqvqKxAzcvDzj7PdZOstOZP9wtw/wSIoV3FmNxF16CvytxhJnHYbSRhUwqzR542OO/J9CDRWS3SSp4hZA==} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + birpc@2.5.0: + resolution: {integrity: sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==} + + boundary@2.0.0: + resolution: {integrity: sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + cacheable@2.0.3: + resolution: {integrity: sha512-nZF80J3d8RMrroMSYm1E9pBllVDXWPuECZgEZxH+vusCY4MAXAJVrY0jutcHSgh3xYX3G2EUNnmtWGZVVjWCXw==} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + ccount@1.1.0: + resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + + ci-info@1.6.0: + resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-truncate@5.1.0: + resolution: {integrity: sha512-7JDGG+4Zp0CsknDCedl0DYdaeOhc46QNpXi3NLQblkZpXXgA6LncLDUUyvrjSvZeF3VRQa+KiMGomazQrC1V8g==} + engines: {node: '>=20'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-regexp@1.0.1: + resolution: {integrity: sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw==} + engines: {node: '>=0.10.0'} + + clone-regexp@2.2.0: + resolution: {integrity: sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@14.0.1: + resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} + engines: {node: '>=20'} + + commandpost@1.4.0: + resolution: {integrity: sha512-aE2Y4MTFJ870NuB/+2z1cXBhSBBzRydVVjzhFC4gtenEhpnj15yu0qptWGJsO9YGrcPZ3ezX8AWb1VA391MKpQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + doublearray@0.0.2: + resolution: {integrity: sha1-Yxhv6NNEEydtNiH2qg7F954ifvk=} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.1: + resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@0.8.0: + resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} + engines: {node: '>=4'} + + execall@1.0.0: + resolution: {integrity: sha512-/J0Q8CvOvlAdpvhfkD/WnTQ4H1eU0exze2nFGPj/RSC7jpQ0NkKe2r28T5eMkhEEs+fzepMZNy1kVRKNlC04nQ==} + engines: {node: '>=0.10.0'} + + execall@2.0.0: + resolution: {integrity: sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==} + engines: {node: '>=8'} + + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-equals@4.0.3: + resolution: {integrity: sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + feed@5.1.0: + resolution: {integrity: sha512-qGNhgYygnefSkAHHrNHqC7p3R8J0/xQDS/cYUud8er/qD9EFGWyCdUDfULHTJQN1d3H3WprzVwMc9MfB4J50Wg==} + engines: {node: '>=20', pnpm: '>=10'} + + file-entry-cache@5.0.1: + resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} + engines: {node: '>=4'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + flat-cache@2.0.1: + resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} + engines: {node: '>=4'} + + flat-cache@6.1.17: + resolution: {integrity: sha512-Jzse4YoiUJBVYTwz5Bwl4h/2VQM7e2KK3MVAMlXzX9uamIHAH/TXUlRKU1AQGQOryQhN0EsmufiiF40G057YXA==} + + flatted@2.0.2: + resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + floating-vue@5.2.2: + resolution: {integrity: sha512-afW+h2CFafo+7Y9Lvw/xsqjaQlKLdJV7h1fCHfcYQ1C4SVMlu7OAekqWgu5d4SgvkBVU0pVpLlVsrSTBURFRkg==} + peerDependencies: + '@nuxt/kit': ^3.2.0 + vue: ^3.2.0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + focus-trap@7.6.5: + resolution: {integrity: sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-stdin@5.0.1: + resolution: {integrity: sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==} + engines: {node: '>=0.12.0'} + + get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + gsap@3.13.0: + resolution: {integrity: sha512-QL7MJ2WMjm1PHWsoFrAQH/J8wUeqZvMtHO58qdekHpCfhvhSL4gSiz6vJf5EeMP0LOn3ZCprL2ki/gjED8ghVw==} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + hookified@1.12.1: + resolution: {integrity: sha512-xnKGl+iMIlhrZmGHB729MqlmPoWBznctSQTYCpFKqNsCgimJQmithcW0xSQMMFzYnV2iKUh25alswn6epgxS0Q==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + image-size@2.0.2: + resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} + engines: {node: '>=16.x'} + hasBin: true + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-ci@1.2.1: + resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} + hasBin: true + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-file@1.0.0: + resolution: {integrity: sha512-ZGMuc+xA8mRnrXtmtf2l/EkIW2zaD2LSBWlaOVEF6yH4RTndHob65V4SwWWdtGKVthQfXPVKsXqw4TDUjbVxVQ==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-regexp@2.1.0: + resolution: {integrity: sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==} + engines: {node: '>=6'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-supported-regexp-flag@1.0.1: + resolution: {integrity: sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==} + engines: {node: '>=0.10.0'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + japanese-numerals-to-number@1.0.2: + resolution: {integrity: sha512-rgs/V7G8Gfy8Z4XtnVBYXzWMAb9oUWp1pDdRmwHmh0hcjcy1kOu+DOpC5rwoHUAN4TqANwb7WD6z5W2v7v7PQQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + keyv@5.5.3: + resolution: {integrity: sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + kuromoji@0.1.2: + resolution: {integrity: sha512-V0dUf+C2LpcPEXhoHLMAop/bOht16Dyr+mDiIE39yX3vqau7p80De/koFqpiTcL1zzdZlc3xuHZ8u5gjYRfFaQ==} + + kuromojin@3.0.0: + resolution: {integrity: sha512-3h3qnn/NVVhqoKFP4oc7e6apO2B01Atc056oiVlIY7Uoup4rhrnBe28g3y9lK1HTmLDQEejvXB+3I3qxAneF7A==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + lint-staged@16.2.3: + resolution: {integrity: sha512-1OnJEESB9zZqsp61XHH2fvpS1es3hRCxMplF/AJUDa8Ho8VrscYDIuxGrj3m8KPXbcWZ8fT9XTMUhEQmOVKpKw==} + engines: {node: '>=20.17'} + hasBin: true + + listr2@9.0.4: + resolution: {integrity: sha512-1wd/kpAdKRLwv7/3OKC8zZ5U8e/fajCfWMxacUvB79S5nLrYGPtUI/8chMQhn3LQjsRVErTb9i1ECAwW0ZIHnQ==} + engines: {node: '>=20.0.0'} + + load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.uniqwith@4.5.0: + resolution: {integrity: sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + longest-streak@2.0.4: + resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + lru_map@0.4.1: + resolution: {integrity: sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg==} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + markdown-it-image-size@15.0.1: + resolution: {integrity: sha512-qnnnYtXXdUsBtNyywsMpgXDGi0X4Judba0+MJFGa2GrKrE9zwWlng+3GWlv2uRRtM0BO/le3G6x1Xw/iCjiT5g==} + engines: {node: '>= 20'} + peerDependencies: + markdown-it: '>= 10 < 15' + peerDependenciesMeta: + markdown-it: + optional: true + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + markdown-table@2.0.0: + resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} + + markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + + markdown-title@1.0.2: + resolution: {integrity: sha512-MqIQVVkz+uGEHi3TsHx/czcxxCbRIL7sv5K5DnYw/tI+apY54IbPefV/cmgxp6LoJSEx/TqcHdLs/298afG5QQ==} + engines: {node: '>=6'} + + match-index@1.0.3: + resolution: {integrity: sha512-1XjyBWqCvEFFUDW/MPv0RwbITRD4xQXOvKoPYtLDq8IdZTfdF/cQSo5Yn4qvhfSSZgjgkTFsqJD2wOUG4ovV8Q==} + + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + + mdast-util-find-and-replace@1.1.1: + resolution: {integrity: sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==} + + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-footnote@0.1.7: + resolution: {integrity: sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==} + + mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-frontmatter@0.2.0: + resolution: {integrity: sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@0.1.3: + resolution: {integrity: sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==} + + mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@0.2.3: + resolution: {integrity: sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@0.1.6: + resolution: {integrity: sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@0.1.6: + resolution: {integrity: sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@0.1.2: + resolution: {integrity: sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@0.6.5: + resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + micromark-core-commonmark@2.0.1: + resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + + micromark-extension-footnote@0.3.2: + resolution: {integrity: sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==} + + micromark-extension-frontmatter@0.2.2: + resolution: {integrity: sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@0.5.7: + resolution: {integrity: sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==} + + micromark-extension-gfm-strikethrough@0.6.5: + resolution: {integrity: sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==} + + micromark-extension-gfm-table@0.4.3: + resolution: {integrity: sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==} + + micromark-extension-gfm-tagfilter@0.3.0: + resolution: {integrity: sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==} + + micromark-extension-gfm-task-list-item@0.3.3: + resolution: {integrity: sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==} + + micromark-extension-gfm@0.3.3: + resolution: {integrity: sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + millify@6.1.0: + resolution: {integrity: sha512-H/E3J6t+DQs/F2YgfDhxUVZz/dF8JXPPKTLHL/yHCcLZLtCXJDUaqvhJXQwqOVBvbyNn4T0WjLpIHd7PAw7fBA==} + hasBin: true + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minisearch@7.1.2: + resolution: {integrity: sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + moji@0.5.1: + resolution: {integrity: sha512-xYylXOjBS9mE/d690InK3Y74NpE0El0TmAKDmKJveWk9jds/0Tl7MQP4yhavS0U64diEq+5ey2905nhCpIHE+Q==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nano-spawn@1.0.3: + resolution: {integrity: sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA==} + engines: {node: '>=20.17'} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-path@1.0.0: + resolution: {integrity: sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==} + engines: {node: '>=0.10.0'} + + npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + + object-assign@3.0.0: + resolution: {integrity: sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.3: + resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-glob-pattern@2.0.1: + resolution: {integrity: sha512-tmciSlVyHnX0LC86+zSr+0LURw9rDPw8ilhXcmTpVUOnI6OsKdCzXQs5fTG10Bjz26IBdnKL3XIaP+QvGsk5YQ==} + + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + + path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.2.0: + resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} + + pluralize@2.0.0: + resolution: {integrity: sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + pretty-bytes@7.0.1: + resolution: {integrity: sha512-285/jRCYIbMGDciDdrw0KPNC4LKEEwz/bwErcYNxSJOi4CpGUuLpb9gQpg3XJP0XYj9ldSRluXxih4lX2YN8Xw==} + engines: {node: '>=20'} + + prh@5.4.4: + resolution: {integrity: sha512-UATF+R/2H8owxwPvF12Knihu9aYGTuZttGHrEEq5NBWz38mREh23+WvCVKX3fhnIZIMV7ye6E1fnqAl+V6WYEw==} + hasBin: true + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + + rc-config-loader@4.1.3: + resolution: {integrity: sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==} + + read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + + read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + regx@1.0.4: + resolution: {integrity: sha512-Z/5ochRUyD5TkJgFq+66ajKePlj6KzpSLfDO2lOLOLu7E82xAjNux0m8mx1DAXBj5ECHiRCBWoqL25b4lkwcgw==} + + remark-footnotes@3.0.0: + resolution: {integrity: sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==} + + remark-frontmatter@3.0.0: + resolution: {integrity: sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@1.0.0: + resolution: {integrity: sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-parse@9.0.0: + resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.46.2: + resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shiki@3.13.0: + resolution: {integrity: sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g==} + + shiki@3.9.2: + resolution: {integrity: sha512-t6NKl5e/zGTvw/IyftLcumolgOczhuroqwXngDeMqJ3h3EQiTY/7wmfgPlsmloD8oYfqkEDqxiaH37Pjm1zUhQ==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.18: + resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + + string-width@8.1.0: + resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + engines: {node: '>=20'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + + strip-indent@2.0.0: + resolution: {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==} + engines: {node: '>=4'} + + structured-source@4.0.0: + resolution: {integrity: sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==} + + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + engines: {node: '>=16'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + sync-fetch@0.5.2: + resolution: {integrity: sha512-6gBqqkHrYvkH65WI2bzrDwrIKmt3U10s4Exnz3dYuE5Ah62FIfNv/F63inrNhu2Nyh3GH5f42GKU3RrSJoaUyQ==} + engines: {node: '>=14'} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + textlint-filter-rule-allowlist@4.0.0: + resolution: {integrity: sha512-rOlWr12sff9ZS8mOtRACPB3l1yK0oW21Owz8XsTAgFWmRhOnBbCKw8tKMDm6EtQHO92SOfyJmT4nowxiJ85Qiw==} + peerDependencies: + textlint: '>= 9.0.0' + + textlint-filter-rule-comments@1.2.2: + resolution: {integrity: sha512-AtyxreCPb3Hq/bd6Qd6szY1OGgnW34LOjQXAHzE8NoXbTUudQqALPdRe+hvRsf81rnmGLxBiCUXZbnbpIseFyw==} + peerDependencies: + textlint: '>=6.8.0' + + textlint-rule-helper@1.2.0: + resolution: {integrity: sha512-yJmVbmyuUPOndKsxOijpx/G7mwybXXf4M10U2up0BeIZSN+6drUl+aSKAoC+RUHY7bG4ogLwRcmWoNG1lSrRIQ==} + + textlint-rule-helper@2.3.1: + resolution: {integrity: sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==} + + textlint-rule-ja-nakaguro-or-halfwidth-space-between-katakana@2.4.3: + resolution: {integrity: sha512-xIpEAgpaPTnavzCMLcSB/tlZ3Tq9paclyyMEgAQxkM9adv8TrwddZ+Ys+BSd4zjuVa94NED0bajYWtahSjZ53g==} + + textlint-rule-ja-no-space-around-parentheses@2.4.2: + resolution: {integrity: sha512-DmmWEKu2hFJs/C4Ruxm/Zkp5gc9W+8kTgUULx54J00MJyJgLWm0XY9BH3OdN66+4+3BFutvxzCLU9y/M1+Dx7w==} + + textlint-rule-ja-no-space-between-full-width@2.4.2: + resolution: {integrity: sha512-yDiZrJYX2cVO85tLw+ojUntky44ijEfIX2sWinIEN0IdYMCINjYwmgRYFmnqwQ+MZyo+foAt2vLUZtaSZlk/Lw==} + + textlint-rule-ja-space-after-exclamation@2.4.2: + resolution: {integrity: sha512-3qH0aIG48MrA8qhcljGSGxPmvrrmOQsP/kTfj8SGDKdkBUs05z1x1bgw106RVNVv1enz2v+ZafuVdgFViRKWfA==} + + textlint-rule-ja-space-after-question@2.4.2: + resolution: {integrity: sha512-ie1R03y1606QApXu+ZF6X+bAJLccRy/lA5JityfTO9M4EM+7ENMle9fTMoEEKJkNkjHaLi530IzqAZ+CLEe8Qw==} + + textlint-rule-ja-space-around-code@2.4.2: + resolution: {integrity: sha512-DM4OF7seafTKrxPFjUJyxx/lwlg8CO3wgwmTJWhQ+6po3mQVV6QaBHpc0861/32kUAJm1ZgRpiBlDWUdraXFFA==} + + textlint-rule-ja-space-around-link@2.4.2: + resolution: {integrity: sha512-++o4wwCnDiubgE60QuOv0xW/0EcF2ta4EfjOycYsLYqvJ6DzFEZFGv3S/TujzmrIdRc8sHAO62489flvPu1DsQ==} + + textlint-rule-ja-space-between-half-and-full-width@2.4.2: + resolution: {integrity: sha512-GqwSy0ivm4Q5Bok9LaOwfg+H1auLRMoMi2aY/7aSIrgvX/RD5aZ2Rk2lm3TTX42mR1UrQu8GDqktUEZfvQ913w==} + + textlint-rule-no-hankaku-kana@1.0.2: + resolution: {integrity: sha512-3wcCi2zz68+0Lzc+2a3A0JIkj0CRW02GrwP12KDOi+k6ouJ4E9C1qP09wb0CJCIJeSctcXuWmaNNgo+HC7lWRQ==} + + textlint-rule-no-mix-dearu-desumasu@5.0.0: + resolution: {integrity: sha512-fBNWXBUeP9xuxZYjNqm3PQDsHStYPxpkJaLwTvbNQEZ6rpC1dHsHwLujYtuAQVuvrfxxU6J4jtepP61rhjPA8g==} + + textlint-rule-no-nfd@1.0.2: + resolution: {integrity: sha512-n6tUx40/V6koDo78qqePHxSovuwSIKO0xwY3FCqVDbcfg9GxQCjde1twQJ99T3bs4LabhPOo/Pt3USaQ9XcTRQ==} + + textlint-rule-no-zero-width-spaces@1.0.1: + resolution: {integrity: sha512-AkxpzBILGB4YsXddzHx2xqpXmqMv5Yd+PQm4anUV+ADSJuwLP1Jd6yHf/LOtu9j3ps8K3XM9vQrXRK73z0bU3A==} + + textlint-rule-preset-ja-spacing@2.4.3: + resolution: {integrity: sha512-WAiWY9TOE8/bRdl14XJdjkPQcV0hLS4O+PCUYU1yxXmJhZ8V3ciw2GYqpA9GL73qAxL25UD6mkf1yfz6aJ4qSA==} + + textlint-rule-preset-jtf-style@2.3.14: + resolution: {integrity: sha512-xkVclRrC921eejsDP79dt7UhwT15825etgQSQx8SvOqaPRNwDdQ7kzep4LIyrdLgPm/3k/gX8qyw0BrN02U27w==} + peerDependencies: + textlint: '>= 5.6.0' + + textlint-rule-preset-vuejs-jp@https://codeload.github.com/vuejs-jp/textlint-rule-preset-vuejs-jp/tar.gz/d62d64c25aed61a5f7455028b31aca7640181a13: + resolution: {tarball: https://codeload.github.com/vuejs-jp/textlint-rule-preset-vuejs-jp/tar.gz/d62d64c25aed61a5f7455028b31aca7640181a13} + version: 1.3.0 + + textlint-rule-prh@5.3.0: + resolution: {integrity: sha512-gdod+lL1SWUDyXs1ICEwvQawaSshT3mvPGufBIjF2R5WFPdKQDMsiuzsjkLm+aF+9d97dA6pFsiyC8gSW7mSgg==} + + textlint@13.4.1: + resolution: {integrity: sha512-ev6XkQEUMWcW90hTHJKlvt23ca1AtmmK2iw4mazqKnSVz8PTSMg45NB68ht3ev92lIPD+8Wt4D6JxCInZkh4GQ==} + engines: {node: '>=16.0.0'} + hasBin: true + + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + + tokenx@1.1.0: + resolution: {integrity: sha512-KCjtiC2niPwTSuz4ktM82Ki5bjqBwYpssiHDsGr5BpejN/B3ksacRvrsdoxljdMIh2nCX78alnDkeemBmYUmTA==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + traverse@0.6.9: + resolution: {integrity: sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==} + engines: {node: '>= 0.4'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + try-resolve@1.0.1: + resolution: {integrity: sha512-yHeaPjCBzVaXwWl5IMUapTaTC2rn/eBYg2fsG2L+CvJd+ttFbk0ylDnpTO3wVhosmE1tQEvcebbBeKLCwScQSQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + twoslash-protocol@0.3.4: + resolution: {integrity: sha512-HHd7lzZNLUvjPzG/IE6js502gEzLC1x7HaO1up/f72d8G8ScWAs9Yfa97igelQRDl5h9tGcdFsRp+lNVre1EeQ==} + + twoslash-vue@0.3.4: + resolution: {integrity: sha512-R9hHbmfQMAiHG2UjB0tVFanEzz0SHDa9ZSxowAQFQMPPZSUSuP0meVG2BW2O+q7NAWzya8aJh/eXtPIMX3qsxA==} + peerDependencies: + typescript: ^5.5.0 + + twoslash@0.3.4: + resolution: {integrity: sha512-RtJURJlGRxrkJmTcZMjpr7jdYly1rfgpujJr1sBM9ch7SKVht/SjFk23IOAyvwT1NLCk+SJiMrvW4rIAUM2Wug==} + peerDependencies: + typescript: ^5.5.0 + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedarray.prototype.slice@1.0.3: + resolution: {integrity: sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==} + engines: {node: '>= 0.4'} + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unified@9.2.2: + resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + + unique-concat@0.2.2: + resolution: {integrity: sha512-nFT3frbsvTa9rrc71FJApPqXF8oIhVHbX3IWgObQi1mF7WrW48Ys70daL7o4evZUtmUf6Qn6WK0LbHhyO0hpXw==} + + unist-util-is@3.0.0: + resolution: {integrity: sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==} + + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + + unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@2.1.2: + resolution: {integrity: sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==} + + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + + unist-util-visit-parents@4.1.1: + resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@1.4.1: + resolution: {integrity: sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==} + + unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + + unist-util-visit@3.1.0: + resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + unorm@1.6.0: + resolution: {integrity: sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==} + engines: {node: '>= 0.4.0'} + + untildify@3.0.3: + resolution: {integrity: sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==} + engines: {node: '>=4'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + + vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + + vite@7.1.5: + resolution: {integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.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 + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitepress-plugin-group-icons@1.6.3: + resolution: {integrity: sha512-bvPD4lhraLJw3rPtLhUIVsOvNfnHnF+F1LH7BKHekEzeZ4uqdTdqnwEyaT580AoKjjT6/F8En6hVJj7takPKDA==} + peerDependencies: + markdown-it: '>=14' + vite: '>=3' + + vitepress-plugin-llms@1.8.0: + resolution: {integrity: sha512-JQR2j+4OpB0GlmXSJCdTHYIx4AcOZ0LVLRwQVId1wvNRRRGTVs17S5YkBNV0oj8t0zTgJ+TE61f58CJC8CTe4w==} + + vitepress@2.0.0-alpha.12: + resolution: {integrity: sha512-yZwCwRRepcpN5QeAhwSnEJxS3I6zJcVixqL1dnm6km4cnriLpQyy2sXQDsE5Ti3pxGPbhU51nTMwI+XC1KNnJg==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + oxc-minify: ^0.82.1 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + oxc-minify: + optional: true + postcss: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-resize@2.0.0-alpha.1: + resolution: {integrity: sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==} + peerDependencies: + vue: ^3.0.0 + + vue-tsc@3.1.0: + resolution: {integrity: sha512-fbMynMG7kXSnqZTRBSCh9ROYaVpXfCZbEO0gY3lqOjLbp361uuS88n6BDajiUriDIF+SGLWoinjvf6stS2J3Gg==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.22: + resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write@1.0.3: + resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} + engines: {node: '>=4'} + + xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yorkie@2.0.0: + resolution: {integrity: sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==} + engines: {node: '>=4'} + + zlibjs@0.3.1: + resolution: {integrity: sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w==} + + zwitch@1.0.5: + resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 + + '@antfu/utils@9.2.0': {} + + '@azu/format-text@1.0.2': {} + + '@azu/style-format@1.0.1': + dependencies: + '@azu/format-text': 1.0.2 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/parser@7.28.3': + dependencies: + '@babel/types': 7.28.2 + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@cacheable/memoize@2.0.3': + dependencies: + '@cacheable/utils': 2.0.3 + + '@cacheable/memory@2.0.3': + dependencies: + '@cacheable/memoize': 2.0.3 + '@cacheable/utils': 2.0.3 + '@keyv/bigmap': 1.0.2 + hookified: 1.12.1 + keyv: 5.5.3 + + '@cacheable/utils@2.0.3': {} + + '@docsearch/css@4.0.0-beta.7': {} + + '@docsearch/js@4.0.0-beta.7': {} + + '@esbuild/aix-ppc64@0.25.1': + optional: true + + '@esbuild/android-arm64@0.25.1': + optional: true + + '@esbuild/android-arm@0.25.1': + optional: true + + '@esbuild/android-x64@0.25.1': + optional: true + + '@esbuild/darwin-arm64@0.25.1': + optional: true + + '@esbuild/darwin-x64@0.25.1': + optional: true + + '@esbuild/freebsd-arm64@0.25.1': + optional: true + + '@esbuild/freebsd-x64@0.25.1': + optional: true + + '@esbuild/linux-arm64@0.25.1': + optional: true + + '@esbuild/linux-arm@0.25.1': + optional: true + + '@esbuild/linux-ia32@0.25.1': + optional: true + + '@esbuild/linux-loong64@0.25.1': + optional: true + + '@esbuild/linux-mips64el@0.25.1': + optional: true + + '@esbuild/linux-ppc64@0.25.1': + optional: true + + '@esbuild/linux-riscv64@0.25.1': + optional: true + + '@esbuild/linux-s390x@0.25.1': + optional: true + + '@esbuild/linux-x64@0.25.1': + optional: true + + '@esbuild/netbsd-arm64@0.25.1': + optional: true + + '@esbuild/netbsd-x64@0.25.1': + optional: true + + '@esbuild/openbsd-arm64@0.25.1': + optional: true + + '@esbuild/openbsd-x64@0.25.1': + optional: true + + '@esbuild/sunos-x64@0.25.1': + optional: true + + '@esbuild/win32-arm64@0.25.1': + optional: true + + '@esbuild/win32-ia32@0.25.1': + optional: true + + '@esbuild/win32-x64@0.25.1': + optional: true + + '@floating-ui/core@1.6.2': + dependencies: + '@floating-ui/utils': 0.2.2 + + '@floating-ui/dom@1.1.1': + dependencies: + '@floating-ui/core': 1.6.2 + + '@floating-ui/utils@0.2.2': {} + + '@iconify-json/logos@1.2.4': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/simple-icons@1.2.47': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/vscode-icons@1.2.29': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.0.1': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 9.2.0 + '@iconify/types': 2.0.0 + debug: 4.4.1 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.1 + mlly: 1.7.4 + transitivePeerDependencies: + - supports-color + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@keyv/bigmap@1.0.2': + dependencies: + hookified: 1.12.1 + + '@keyv/serialize@1.1.1': {} + + '@rolldown/pluginutils@1.0.0-beta.29': {} + + '@rollup/rollup-android-arm-eabi@4.46.2': + optional: true + + '@rollup/rollup-android-arm64@4.46.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.46.2': + optional: true + + '@rollup/rollup-darwin-x64@4.46.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.46.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.46.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.46.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.46.2': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.46.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.46.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.46.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.46.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.46.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.46.2': + optional: true + + '@shikijs/core@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/core@3.9.2': + dependencies: + '@shikijs/types': 3.9.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + + '@shikijs/engine-javascript@3.9.2': + dependencies: + '@shikijs/types': 3.9.2 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + + '@shikijs/engine-oniguruma@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/engine-oniguruma@3.9.2': + dependencies: + '@shikijs/types': 3.9.2 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/langs@3.9.2': + dependencies: + '@shikijs/types': 3.9.2 + + '@shikijs/themes@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/themes@3.9.2': + dependencies: + '@shikijs/types': 3.9.2 + + '@shikijs/transformers@3.9.2': + dependencies: + '@shikijs/core': 3.9.2 + '@shikijs/types': 3.9.2 + + '@shikijs/twoslash@3.13.0(typescript@5.9.2)': + dependencies: + '@shikijs/core': 3.13.0 + '@shikijs/types': 3.13.0 + twoslash: 0.3.4(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@shikijs/types@3.13.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/types@3.9.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vitepress-twoslash@3.13.0(typescript@5.9.2)': + dependencies: + '@shikijs/twoslash': 3.13.0(typescript@5.9.2) + floating-vue: 5.2.2(vue@3.5.22(typescript@5.9.2)) + lz-string: 1.5.0 + magic-string: 0.30.19 + markdown-it: 14.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm: 3.1.0 + mdast-util-to-hast: 13.2.0 + ohash: 2.0.11 + shiki: 3.13.0 + twoslash: 0.3.4(typescript@5.9.2) + twoslash-vue: 0.3.4(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.2) + transitivePeerDependencies: + - '@nuxt/kit' + - supports-color + - typescript + + '@shikijs/vscode-textmate@10.0.2': {} + + '@textlint-rule/textlint-rule-no-invalid-control-character@2.0.0': + dependencies: + execall: 1.0.0 + + '@textlint/ast-node-types@12.6.1': {} + + '@textlint/ast-node-types@13.4.1': {} + + '@textlint/ast-tester@13.4.1': + dependencies: + '@textlint/ast-node-types': 13.4.1 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@textlint/ast-traverse@13.4.1': + dependencies: + '@textlint/ast-node-types': 13.4.1 + + '@textlint/config-loader@13.4.1': + dependencies: + '@textlint/kernel': 13.4.1 + '@textlint/module-interop': 13.4.1 + '@textlint/types': 13.4.1 + '@textlint/utils': 13.4.1 + debug: 4.4.0 + rc-config-loader: 4.1.3 + try-resolve: 1.0.1 + transitivePeerDependencies: + - supports-color + + '@textlint/feature-flag@13.4.1': {} + + '@textlint/fixer-formatter@13.4.1': + dependencies: + '@textlint/module-interop': 13.4.1 + '@textlint/types': 13.4.1 + chalk: 4.1.2 + debug: 4.4.0 + diff: 4.0.2 + is-file: 1.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + try-resolve: 1.0.1 + transitivePeerDependencies: + - supports-color + + '@textlint/get-config-base-dir@2.0.0': {} + + '@textlint/kernel@13.4.1': + dependencies: + '@textlint/ast-node-types': 13.4.1 + '@textlint/ast-tester': 13.4.1 + '@textlint/ast-traverse': 13.4.1 + '@textlint/feature-flag': 13.4.1 + '@textlint/source-code-fixer': 13.4.1 + '@textlint/types': 13.4.1 + '@textlint/utils': 13.4.1 + debug: 4.4.0 + fast-equals: 4.0.3 + structured-source: 4.0.0 + transitivePeerDependencies: + - supports-color + + '@textlint/linter-formatter@13.4.1': + dependencies: + '@azu/format-text': 1.0.2 + '@azu/style-format': 1.0.1 + '@textlint/module-interop': 13.4.1 + '@textlint/types': 13.4.1 + chalk: 4.1.2 + debug: 4.4.0 + js-yaml: 3.14.1 + lodash: 4.17.21 + pluralize: 2.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + table: 6.8.2 + text-table: 0.2.0 + try-resolve: 1.0.1 + transitivePeerDependencies: + - supports-color + + '@textlint/markdown-to-ast@13.4.1': + dependencies: + '@textlint/ast-node-types': 13.4.1 + debug: 4.4.0 + mdast-util-gfm-autolink-literal: 0.1.3 + remark-footnotes: 3.0.0 + remark-frontmatter: 3.0.0 + remark-gfm: 1.0.0 + remark-parse: 9.0.0 + traverse: 0.6.9 + unified: 9.2.2 + transitivePeerDependencies: + - supports-color + + '@textlint/module-interop@12.6.1': {} + + '@textlint/module-interop@13.4.1': {} + + '@textlint/regexp-string-matcher@1.1.1': + dependencies: + escape-string-regexp: 2.0.0 + execall: 2.0.0 + lodash.sortby: 4.7.0 + lodash.uniq: 4.5.0 + lodash.uniqwith: 4.5.0 + to-regex: 3.0.2 + + '@textlint/regexp-string-matcher@2.0.2': + dependencies: + escape-string-regexp: 4.0.0 + lodash.sortby: 4.7.0 + lodash.uniq: 4.5.0 + lodash.uniqwith: 4.5.0 + + '@textlint/source-code-fixer@13.4.1': + dependencies: + '@textlint/types': 13.4.1 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@textlint/text-to-ast@13.4.1': + dependencies: + '@textlint/ast-node-types': 13.4.1 + + '@textlint/textlint-plugin-markdown@13.4.1': + dependencies: + '@textlint/markdown-to-ast': 13.4.1 + transitivePeerDependencies: + - supports-color + + '@textlint/textlint-plugin-text@13.4.1': + dependencies: + '@textlint/text-to-ast': 13.4.1 + + '@textlint/types@13.4.1': + dependencies: + '@textlint/ast-node-types': 13.4.1 + + '@textlint/utils@13.4.1': {} + + '@type-challenges/utils@0.1.1': {} + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.18.8 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.18.8 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/estree@1.0.8': {} + + '@types/express-serve-static-core@5.0.6': + dependencies: + '@types/node': 22.18.8 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@5.0.3': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 5.0.6 + '@types/serve-static': 1.15.7 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.2 + + '@types/http-errors@2.0.4': {} + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.10 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.2 + + '@types/mdurl@2.0.0': {} + + '@types/mime@1.3.5': {} + + '@types/ms@0.7.34': {} + + '@types/node@22.18.8': + dependencies: + undici-types: 6.21.0 + + '@types/qs@6.9.15': {} + + '@types/range-parser@1.2.7': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.18.8 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.18.8 + '@types/send': 0.17.4 + + '@types/unist@2.0.10': {} + + '@types/unist@3.0.2': {} + + '@types/web-bluetooth@0.0.21': {} + + '@typescript/vfs@1.6.1(typescript@5.9.2)': + dependencies: + debug: 4.4.1 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@ungap/structured-clone@1.2.0': {} + + '@vitejs/plugin-vue@6.0.1(vite@7.1.5(@types/node@22.18.8)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2))': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.29 + vite: 7.1.5(@types/node@22.18.8)(yaml@2.8.1) + vue: 3.5.22(typescript@5.9.2) + + '@volar/language-core@2.4.23': + dependencies: + '@volar/source-map': 2.4.23 + + '@volar/source-map@2.4.23': {} + + '@volar/typescript@2.4.23': + dependencies: + '@volar/language-core': 2.4.23 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.21': + dependencies: + '@babel/parser': 7.28.3 + '@vue/shared': 3.5.21 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-core@3.5.22': + dependencies: + '@babel/parser': 7.28.4 + '@vue/shared': 3.5.22 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.21': + dependencies: + '@vue/compiler-core': 3.5.21 + '@vue/shared': 3.5.21 + + '@vue/compiler-dom@3.5.22': + dependencies: + '@vue/compiler-core': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/compiler-sfc@3.5.22': + dependencies: + '@babel/parser': 7.28.4 + '@vue/compiler-core': 3.5.22 + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + estree-walker: 2.0.2 + magic-string: 0.30.19 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.22': + dependencies: + '@vue/compiler-dom': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/devtools-api@8.0.0': + dependencies: + '@vue/devtools-kit': 8.0.0 + + '@vue/devtools-kit@8.0.0': + dependencies: + '@vue/devtools-shared': 8.0.0 + birpc: 2.5.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.2 + + '@vue/devtools-shared@8.0.0': + dependencies: + rfdc: 1.4.1 + + '@vue/language-core@3.0.7(typescript@5.9.2)': + dependencies: + '@volar/language-core': 2.4.23 + '@vue/compiler-dom': 3.5.21 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.21 + alien-signals: 2.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.3 + optionalDependencies: + typescript: 5.9.2 + + '@vue/language-core@3.1.0(typescript@5.9.2)': + dependencies: + '@volar/language-core': 2.4.23 + '@vue/compiler-dom': 3.5.21 + '@vue/shared': 3.5.21 + alien-signals: 3.0.0 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.3 + optionalDependencies: + typescript: 5.9.2 + + '@vue/reactivity@3.5.22': + dependencies: + '@vue/shared': 3.5.22 + + '@vue/runtime-core@3.5.22': + dependencies: + '@vue/reactivity': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/runtime-dom@3.5.22': + dependencies: + '@vue/reactivity': 3.5.22 + '@vue/runtime-core': 3.5.22 + '@vue/shared': 3.5.22 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.9.2))': + dependencies: + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + vue: 3.5.22(typescript@5.9.2) + + '@vue/shared@3.5.18': {} + + '@vue/shared@3.5.21': {} + + '@vue/shared@3.5.22': {} + + '@vueuse/core@13.6.0(vue@3.5.22(typescript@5.9.2))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.6.0 + '@vueuse/shared': 13.6.0(vue@3.5.22(typescript@5.9.2)) + vue: 3.5.22(typescript@5.9.2) + + '@vueuse/integrations@13.6.0(focus-trap@7.6.5)(vue@3.5.22(typescript@5.9.2))': + dependencies: + '@vueuse/core': 13.6.0(vue@3.5.22(typescript@5.9.2)) + '@vueuse/shared': 13.6.0(vue@3.5.22(typescript@5.9.2)) + vue: 3.5.22(typescript@5.9.2) + optionalDependencies: + focus-trap: 7.6.5 + + '@vueuse/metadata@13.6.0': {} + + '@vueuse/shared@13.6.0(vue@3.5.22(typescript@5.9.2))': + dependencies: + vue: 3.5.22(typescript@5.9.2) + + acorn@8.14.0: {} + + ajv@8.16.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + alien-signals@2.0.5: {} + + alien-signals@3.0.0: {} + + analyze-desumasu-dearu@2.1.5: {} + + analyze-desumasu-dearu@5.0.1: + dependencies: + kuromojin: 3.0.0 + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + assign-symbols@1.0.0: {} + + astral-regex@2.0.0: {} + + async@2.6.4: + dependencies: + lodash: 4.17.21 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + bail@1.0.5: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + birpc@2.5.0: {} + + boundary@2.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + cacheable@2.0.3: + dependencies: + '@cacheable/memoize': 2.0.3 + '@cacheable/memory': 2.0.3 + '@cacheable/utils': 2.0.3 + hookified: 1.12.1 + keyv: 5.5.3 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + ccount@1.1.0: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + character-entities-html4@2.1.0: {} + + character-entities-legacy@1.1.4: {} + + character-entities-legacy@3.0.0: {} + + character-entities@1.2.4: {} + + character-entities@2.0.2: {} + + character-reference-invalid@1.1.4: {} + + charenc@0.0.2: {} + + ci-info@1.6.0: {} + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-truncate@5.1.0: + dependencies: + slice-ansi: 7.1.0 + string-width: 8.1.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-regexp@1.0.1: + dependencies: + is-regexp: 1.0.0 + is-supported-regexp-flag: 1.0.1 + + clone-regexp@2.2.0: + dependencies: + is-regexp: 2.1.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + comma-separated-tokens@2.0.3: {} + + commander@14.0.1: {} + + commandpost@1.4.0: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + + cross-spawn@5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + + crypt@0.0.2: {} + + csstype@3.1.3: {} + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + de-indent@1.0.2: {} + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + define-property@2.0.2: + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@4.0.2: {} + + doublearray@0.0.2: {} + + emoji-regex@10.3.0: {} + + emoji-regex@8.0.0: {} + + entities@4.5.0: {} + + environment@1.1.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + esbuild@0.25.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.1 + '@esbuild/android-arm': 0.25.1 + '@esbuild/android-arm64': 0.25.1 + '@esbuild/android-x64': 0.25.1 + '@esbuild/darwin-arm64': 0.25.1 + '@esbuild/darwin-x64': 0.25.1 + '@esbuild/freebsd-arm64': 0.25.1 + '@esbuild/freebsd-x64': 0.25.1 + '@esbuild/linux-arm': 0.25.1 + '@esbuild/linux-arm64': 0.25.1 + '@esbuild/linux-ia32': 0.25.1 + '@esbuild/linux-loong64': 0.25.1 + '@esbuild/linux-mips64el': 0.25.1 + '@esbuild/linux-ppc64': 0.25.1 + '@esbuild/linux-riscv64': 0.25.1 + '@esbuild/linux-s390x': 0.25.1 + '@esbuild/linux-x64': 0.25.1 + '@esbuild/netbsd-arm64': 0.25.1 + '@esbuild/netbsd-x64': 0.25.1 + '@esbuild/openbsd-arm64': 0.25.1 + '@esbuild/openbsd-x64': 0.25.1 + '@esbuild/sunos-x64': 0.25.1 + '@esbuild/win32-arm64': 0.25.1 + '@esbuild/win32-ia32': 0.25.1 + '@esbuild/win32-x64': 0.25.1 + + escalade@3.2.0: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + esprima@4.0.1: {} + + estree-walker@2.0.2: {} + + eventemitter3@5.0.1: {} + + execa@0.8.0: + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + + execall@1.0.0: + dependencies: + clone-regexp: 1.0.1 + + execall@2.0.0: + dependencies: + clone-regexp: 2.2.0 + + exsolve@1.0.7: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-equals@4.0.3: {} + + fast-levenshtein@2.0.6: {} + + fault@1.0.4: + dependencies: + format: 0.2.2 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + feed@5.1.0: + dependencies: + xml-js: 1.6.11 + + file-entry-cache@5.0.1: + dependencies: + flat-cache: 2.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + + flat-cache@2.0.1: + dependencies: + flatted: 2.0.2 + rimraf: 2.6.3 + write: 1.0.3 + + flat-cache@6.1.17: + dependencies: + cacheable: 2.0.3 + flatted: 3.3.3 + hookified: 1.12.1 + + flatted@2.0.2: {} + + flatted@3.3.3: {} + + floating-vue@5.2.2(vue@3.5.22(typescript@5.9.2)): + dependencies: + '@floating-ui/dom': 1.1.1 + vue: 3.5.22(typescript@5.9.2) + vue-resize: 2.0.0-alpha.1(vue@3.5.22(typescript@5.9.2)) + + focus-trap@7.6.5: + dependencies: + tabbable: 6.2.0 + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + format@0.2.2: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.2.0: {} + + get-east-asian-width@1.4.0: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-stdin@5.0.1: {} + + get-stream@3.0.0: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@15.15.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + gsap@3.13.0: {} + + has-bigints@1.0.2: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + he@1.2.0: {} + + hookable@5.5.3: {} + + hookified@1.12.1: {} + + hosted-git-info@2.8.9: {} + + html-void-elements@3.0.0: {} + + image-size@2.0.2: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + is-accessor-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-alphabetical@1.0.4: {} + + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-buffer@2.0.5: {} + + is-callable@1.2.7: {} + + is-ci@1.2.1: + dependencies: + ci-info: 1.6.0 + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-data-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-decimal@1.0.4: {} + + is-descriptor@1.0.3: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-file@1.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + + is-hexadecimal@1.0.4: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-regexp@1.0.0: {} + + is-regexp@2.1.0: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream@1.1.0: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-supported-regexp-flag@1.0.1: {} + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + is-utf8@0.2.1: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-what@4.1.16: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + japanese-numerals-to-number@1.0.2: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-parse-better-errors@1.0.2: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + keyv@5.5.3: + dependencies: + '@keyv/serialize': 1.1.1 + + kind-of@6.0.3: {} + + kolorist@1.8.0: {} + + kuromoji@0.1.2: + dependencies: + async: 2.6.4 + doublearray: 0.0.2 + zlibjs: 0.3.1 + + kuromojin@3.0.0: + dependencies: + kuromoji: 0.1.2 + lru_map: 0.4.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + lint-staged@16.2.3: + dependencies: + commander: 14.0.1 + listr2: 9.0.4 + micromatch: 4.0.8 + nano-spawn: 1.0.3 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.8.1 + + listr2@9.0.4: + dependencies: + cli-truncate: 5.1.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + load-json-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.2.0 + quansync: 0.2.10 + + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + + lodash.sortby@4.7.0: {} + + lodash.truncate@4.4.2: {} + + lodash.uniq@4.5.0: {} + + lodash.uniqwith@4.5.0: {} + + lodash@4.17.21: {} + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + longest-streak@2.0.4: {} + + longest-streak@3.1.0: {} + + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + + lru_map@0.4.1: {} + + lz-string@1.5.0: {} + + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + mark.js@8.11.1: {} + + markdown-it-image-size@15.0.1(markdown-it@14.1.0): + dependencies: + '@types/markdown-it': 14.1.2 + flat-cache: 6.1.17 + image-size: 2.0.2 + sync-fetch: 0.5.2 + optionalDependencies: + markdown-it: 14.1.0 + transitivePeerDependencies: + - encoding + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + markdown-table@2.0.0: + dependencies: + repeat-string: 1.6.1 + + markdown-table@3.0.3: {} + + markdown-title@1.0.2: {} + + match-index@1.0.3: + dependencies: + regexp.prototype.flags: 1.5.2 + + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + + mdast-util-find-and-replace@1.1.1: + dependencies: + escape-string-regexp: 4.0.0 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + + mdast-util-find-and-replace@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-footnote@0.1.7: + dependencies: + mdast-util-to-markdown: 0.6.5 + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + + mdast-util-from-markdown@0.8.5: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@0.2.0: + dependencies: + micromark-extension-frontmatter: 0.2.2 + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.0 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@0.1.3: + dependencies: + ccount: 1.1.0 + mdast-util-find-and-replace: 1.1.1 + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.0 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@0.2.3: + dependencies: + mdast-util-to-markdown: 0.6.5 + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@0.1.6: + dependencies: + markdown-table: 2.0.0 + mdast-util-to-markdown: 0.6.5 + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@0.1.6: + dependencies: + mdast-util-to-markdown: 0.6.5 + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@0.1.2: + dependencies: + mdast-util-gfm-autolink-literal: 0.1.3 + mdast-util-gfm-strikethrough: 0.2.3 + mdast-util-gfm-table: 0.1.6 + mdast-util-gfm-task-list-item: 0.1.6 + mdast-util-to-markdown: 0.6.5 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + + mdast-util-to-markdown@0.6.5: + dependencies: + '@types/unist': 2.0.10 + longest-streak: 2.0.4 + mdast-util-to-string: 2.0.0 + parse-entities: 2.0.0 + repeat-string: 1.6.1 + zwitch: 1.0.5 + + mdast-util-to-markdown@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@2.0.0: {} + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdurl@2.0.0: {} + + micromark-core-commonmark@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-footnote@0.3.2: + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + + micromark-extension-frontmatter@0.2.2: + dependencies: + fault: 1.0.4 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-autolink-literal@0.5.7: + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + + micromark-extension-gfm-strikethrough@0.6.5: + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + + micromark-extension-gfm-table@0.4.3: + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + + micromark-extension-gfm-tagfilter@0.3.0: {} + + micromark-extension-gfm-task-list-item@0.3.3: + dependencies: + micromark: 2.11.4 + transitivePeerDependencies: + - supports-color + + micromark-extension-gfm@0.3.3: + dependencies: + micromark: 2.11.4 + micromark-extension-gfm-autolink-literal: 0.5.7 + micromark-extension-gfm-strikethrough: 0.6.5 + micromark-extension-gfm-table: 0.4.3 + micromark-extension-gfm-tagfilter: 0.3.0 + micromark-extension-gfm-task-list-item: 0.3.3 + transitivePeerDependencies: + - supports-color + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@2.0.0: {} + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@2.0.0: {} + + micromark@2.11.4: + dependencies: + debug: 4.4.1 + parse-entities: 2.0.0 + transitivePeerDependencies: + - supports-color + + micromark@4.0.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + millify@6.1.0: + dependencies: + yargs: 17.7.2 + + mimic-function@5.0.1: {} + + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimist@1.2.8: {} + + minisearch@7.1.2: {} + + mitt@3.0.1: {} + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mlly@1.7.4: + dependencies: + acorn: 8.14.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.5.4 + + moji@0.5.1: + dependencies: + object-assign: 3.0.0 + + ms@2.1.2: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nano-spawn@1.0.3: {} + + nanoid@3.3.11: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-path@1.0.0: {} + + npm-run-path@2.0.2: + dependencies: + path-key: 2.0.1 + + object-assign@3.0.0: {} + + object-inspect@1.13.1: {} + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + ohash@2.0.11: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.3: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-finally@1.0.0: {} + + p-limit@1.3.0: + dependencies: + p-try: 1.0.0 + + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 + + p-try@1.0.0: {} + + package-manager-detector@1.3.0: {} + + parse-entities@2.0.0: + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + + parse-json@2.2.0: + dependencies: + error-ex: 1.3.2 + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + + path-browserify@1.0.1: {} + + path-exists@3.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@2.0.1: {} + + path-parse@1.0.7: {} + + path-to-glob-pattern@2.0.1: {} + + path-to-regexp@8.3.0: {} + + path-type@1.1.0: + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + pinkie-promise: 2.0.1 + + path-type@3.0.0: + dependencies: + pify: 3.0.0 + + pathe@2.0.3: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pidtree@0.6.0: {} + + pify@2.3.0: {} + + pify@3.0.0: {} + + pinkie-promise@2.0.1: + dependencies: + pinkie: 2.0.4 + + pinkie@2.0.4: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pkg-types@2.2.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + + pluralize@2.0.0: {} + + possible-typed-array-names@1.0.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + pretty-bytes@7.0.1: {} + + prh@5.4.4: + dependencies: + commandpost: 1.4.0 + diff: 4.0.2 + js-yaml: 3.14.1 + + property-information@7.1.0: {} + + pseudomap@1.0.2: {} + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + quansync@0.2.10: {} + + rc-config-loader@4.1.3: + dependencies: + debug: 4.4.0 + js-yaml: 4.1.0 + json5: 2.2.3 + require-from-string: 2.0.2 + transitivePeerDependencies: + - supports-color + + read-pkg-up@3.0.0: + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + + read-pkg@1.1.0: + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + + read-pkg@3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + + regex-not@1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + regx@1.0.4: {} + + remark-footnotes@3.0.0: + dependencies: + mdast-util-footnote: 0.1.7 + micromark-extension-footnote: 0.3.2 + transitivePeerDependencies: + - supports-color + + remark-frontmatter@3.0.0: + dependencies: + mdast-util-frontmatter: 0.2.0 + micromark-extension-frontmatter: 0.2.2 + + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@1.0.0: + dependencies: + mdast-util-gfm: 0.1.2 + micromark-extension-gfm: 0.3.3 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@9.0.0: + dependencies: + mdast-util-from-markdown: 0.8.5 + transitivePeerDependencies: + - supports-color + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.5 + + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + repeat-string@1.6.1: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + ret@0.1.15: {} + + rfdc@1.4.1: {} + + rimraf@2.6.3: + dependencies: + glob: 7.2.3 + + rollup@4.46.2: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.46.2 + '@rollup/rollup-android-arm64': 4.46.2 + '@rollup/rollup-darwin-arm64': 4.46.2 + '@rollup/rollup-darwin-x64': 4.46.2 + '@rollup/rollup-freebsd-arm64': 4.46.2 + '@rollup/rollup-freebsd-x64': 4.46.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 + '@rollup/rollup-linux-arm-musleabihf': 4.46.2 + '@rollup/rollup-linux-arm64-gnu': 4.46.2 + '@rollup/rollup-linux-arm64-musl': 4.46.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 + '@rollup/rollup-linux-ppc64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-musl': 4.46.2 + '@rollup/rollup-linux-s390x-gnu': 4.46.2 + '@rollup/rollup-linux-x64-gnu': 4.46.2 + '@rollup/rollup-linux-x64-musl': 4.46.2 + '@rollup/rollup-win32-arm64-msvc': 4.46.2 + '@rollup/rollup-win32-ia32-msvc': 4.46.2 + '@rollup/rollup-win32-x64-msvc': 4.46.2 + fsevents: 2.3.3 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safe-regex@1.1.0: + dependencies: + ret: 0.1.15 + + sax@1.4.1: {} + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + semver@5.7.2: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-regex@1.0.0: {} + + shiki@3.13.0: + dependencies: + '@shikijs/core': 3.13.0 + '@shikijs/engine-javascript': 3.13.0 + '@shikijs/engine-oniguruma': 3.13.0 + '@shikijs/langs': 3.13.0 + '@shikijs/themes': 3.13.0 + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + shiki@3.9.2: + dependencies: + '@shikijs/core': 3.9.2 + '@shikijs/engine-javascript': 3.9.2 + '@shikijs/engine-oniguruma': 3.9.2 + '@shikijs/langs': 3.9.2 + '@shikijs/themes': 3.9.2 + '@shikijs/types': 3.9.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + source-map-js@1.2.1: {} + + space-separated-tokens@2.0.2: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.18 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.18 + + spdx-license-ids@3.0.18: {} + + speakingurl@14.0.1: {} + + sprintf-js@1.0.3: {} + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.1.0: + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + string-width@8.1.0: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.0 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom-string@1.0.0: {} + + strip-bom@2.0.0: + dependencies: + is-utf8: 0.2.1 + + strip-bom@3.0.0: {} + + strip-eof@1.0.0: {} + + strip-indent@2.0.0: {} + + structured-source@4.0.0: + dependencies: + boundary: 2.0.0 + + superjson@2.2.2: + dependencies: + copy-anything: 3.0.5 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + sync-fetch@0.5.2: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + tabbable@6.2.0: {} + + table@6.8.2: + dependencies: + ajv: 8.16.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + text-table@0.2.0: {} + + textlint-filter-rule-allowlist@4.0.0(textlint@13.4.1): + dependencies: + '@textlint/ast-node-types': 12.6.1 + '@textlint/get-config-base-dir': 2.0.0 + '@textlint/regexp-string-matcher': 1.1.1 + js-yaml: 4.1.0 + textlint: 13.4.1 + + textlint-filter-rule-comments@1.2.2(textlint@13.4.1): + dependencies: + textlint: 13.4.1 + + textlint-rule-helper@1.2.0: + dependencies: + unist-util-visit: 1.4.1 + + textlint-rule-helper@2.3.1: + dependencies: + '@textlint/ast-node-types': 13.4.1 + structured-source: 4.0.0 + unist-util-visit: 2.0.3 + + textlint-rule-ja-nakaguro-or-halfwidth-space-between-katakana@2.4.3: + dependencies: + textlint-rule-helper: 2.3.1 + + textlint-rule-ja-no-space-around-parentheses@2.4.2: + dependencies: + match-index: 1.0.3 + textlint-rule-helper: 2.3.1 + + textlint-rule-ja-no-space-between-full-width@2.4.2: + dependencies: + match-index: 1.0.3 + regx: 1.0.4 + textlint-rule-helper: 2.3.1 + + textlint-rule-ja-space-after-exclamation@2.4.2: + dependencies: + match-index: 1.0.3 + textlint-rule-helper: 2.3.1 + + textlint-rule-ja-space-after-question@2.4.2: + dependencies: + match-index: 1.0.3 + textlint-rule-helper: 2.3.1 + + textlint-rule-ja-space-around-code@2.4.2: + dependencies: + match-index: 1.0.3 + textlint-rule-helper: 2.3.1 + + textlint-rule-ja-space-around-link@2.4.2: + dependencies: + match-index: 1.0.3 + textlint-rule-helper: 2.3.1 + + textlint-rule-ja-space-between-half-and-full-width@2.4.2: + dependencies: + '@textlint/regexp-string-matcher': 2.0.2 + match-index: 1.0.3 + textlint-rule-helper: 2.3.1 + + textlint-rule-no-hankaku-kana@1.0.2: + dependencies: + match-index: 1.0.3 + textlint-rule-helper: 1.2.0 + + textlint-rule-no-mix-dearu-desumasu@5.0.0: + dependencies: + analyze-desumasu-dearu: 5.0.1 + textlint-rule-helper: 2.3.1 + unist-util-visit: 3.1.0 + + textlint-rule-no-nfd@1.0.2: + dependencies: + match-index: 1.0.3 + textlint-rule-helper: 2.3.1 + unorm: 1.6.0 + + textlint-rule-no-zero-width-spaces@1.0.1: {} + + textlint-rule-preset-ja-spacing@2.4.3: + dependencies: + textlint-rule-ja-nakaguro-or-halfwidth-space-between-katakana: 2.4.3 + textlint-rule-ja-no-space-around-parentheses: 2.4.2 + textlint-rule-ja-no-space-between-full-width: 2.4.2 + textlint-rule-ja-space-after-exclamation: 2.4.2 + textlint-rule-ja-space-after-question: 2.4.2 + textlint-rule-ja-space-around-code: 2.4.2 + textlint-rule-ja-space-around-link: 2.4.2 + textlint-rule-ja-space-between-half-and-full-width: 2.4.2 + + textlint-rule-preset-jtf-style@2.3.14(textlint@13.4.1): + dependencies: + analyze-desumasu-dearu: 2.1.5 + japanese-numerals-to-number: 1.0.2 + match-index: 1.0.3 + moji: 0.5.1 + regexp.prototype.flags: 1.5.2 + regx: 1.0.4 + textlint: 13.4.1 + textlint-rule-helper: 2.3.1 + textlint-rule-prh: 5.3.0 + + textlint-rule-preset-vuejs-jp@https://codeload.github.com/vuejs-jp/textlint-rule-preset-vuejs-jp/tar.gz/d62d64c25aed61a5f7455028b31aca7640181a13(textlint@13.4.1): + dependencies: + '@textlint-rule/textlint-rule-no-invalid-control-character': 2.0.0 + '@textlint/module-interop': 12.6.1 + textlint-rule-no-hankaku-kana: 1.0.2 + textlint-rule-no-mix-dearu-desumasu: 5.0.0 + textlint-rule-no-nfd: 1.0.2 + textlint-rule-no-zero-width-spaces: 1.0.1 + textlint-rule-preset-ja-spacing: 2.4.3 + textlint-rule-preset-jtf-style: 2.3.14(textlint@13.4.1) + transitivePeerDependencies: + - textlint + + textlint-rule-prh@5.3.0: + dependencies: + '@babel/parser': 7.28.3 + prh: 5.4.4 + textlint-rule-helper: 2.3.1 + untildify: 3.0.3 + + textlint@13.4.1: + dependencies: + '@textlint/ast-node-types': 13.4.1 + '@textlint/ast-traverse': 13.4.1 + '@textlint/config-loader': 13.4.1 + '@textlint/feature-flag': 13.4.1 + '@textlint/fixer-formatter': 13.4.1 + '@textlint/kernel': 13.4.1 + '@textlint/linter-formatter': 13.4.1 + '@textlint/module-interop': 13.4.1 + '@textlint/textlint-plugin-markdown': 13.4.1 + '@textlint/textlint-plugin-text': 13.4.1 + '@textlint/types': 13.4.1 + '@textlint/utils': 13.4.1 + debug: 4.3.5 + file-entry-cache: 5.0.1 + get-stdin: 5.0.1 + glob: 7.2.3 + md5: 2.3.0 + mkdirp: 0.5.6 + optionator: 0.9.4 + path-to-glob-pattern: 2.0.1 + rc-config-loader: 4.1.3 + read-pkg: 1.1.0 + read-pkg-up: 3.0.0 + structured-source: 4.0.0 + try-resolve: 1.0.1 + unique-concat: 0.2.2 + transitivePeerDependencies: + - supports-color + + tinyexec@1.0.1: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-regex@3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + + tokenx@1.1.0: {} + + tr46@0.0.3: {} + + traverse@0.6.9: + dependencies: + gopd: 1.0.1 + typedarray.prototype.slice: 1.0.3 + which-typed-array: 1.1.15 + + trim-lines@3.0.1: {} + + trough@1.0.5: {} + + trough@2.2.0: {} + + try-resolve@1.0.1: {} + + twoslash-protocol@0.3.4: {} + + twoslash-vue@0.3.4(typescript@5.9.2): + dependencies: + '@vue/language-core': 3.0.7(typescript@5.9.2) + twoslash: 0.3.4(typescript@5.9.2) + twoslash-protocol: 0.3.4 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + twoslash@0.3.4(typescript@5.9.2): + dependencies: + '@typescript/vfs': 1.6.1(typescript@5.9.2) + twoslash-protocol: 0.3.4 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typedarray.prototype.slice@1.0.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + typed-array-buffer: 1.0.2 + typed-array-byte-offset: 1.0.2 + + typescript@5.9.2: {} + + uc.micro@2.1.0: {} + + ufo@1.5.4: {} + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + undici-types@6.21.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.1 + + unified@9.2.2: + dependencies: + '@types/unist': 2.0.10 + bail: 1.0.5 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 2.1.0 + trough: 1.0.5 + vfile: 4.2.1 + + unique-concat@0.2.2: {} + + unist-util-is@3.0.0: {} + + unist-util-is@4.1.0: {} + + unist-util-is@5.2.1: + dependencies: + '@types/unist': 2.0.10 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-remove@4.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unist-util-stringify-position@2.0.3: + dependencies: + '@types/unist': 2.0.10 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-visit-parents@2.1.2: + dependencies: + unist-util-is: 3.0.0 + + unist-util-visit-parents@3.1.1: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 4.1.0 + + unist-util-visit-parents@4.1.1: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + + unist-util-visit@1.4.1: + dependencies: + unist-util-visit-parents: 2.1.2 + + unist-util-visit@2.0.3: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + + unist-util-visit@3.1.0: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 4.1.1 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unorm@1.6.0: {} + + untildify@3.0.3: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + vfile-message@2.0.4: + dependencies: + '@types/unist': 2.0.10 + unist-util-stringify-position: 2.0.3 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + + vfile@4.2.1: + dependencies: + '@types/unist': 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 2.0.3 + vfile-message: 2.0.4 + + vfile@6.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + + vite@7.1.5(@types/node@22.18.8)(yaml@2.8.1): + dependencies: + esbuild: 0.25.1 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.46.2 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.18.8 + fsevents: 2.3.3 + yaml: 2.8.1 + + vitepress-plugin-group-icons@1.6.3(markdown-it@14.1.0)(vite@7.1.5(@types/node@22.18.8)(yaml@2.8.1)): + dependencies: + '@iconify-json/logos': 1.2.4 + '@iconify-json/vscode-icons': 1.2.29 + '@iconify/utils': 3.0.1 + markdown-it: 14.1.0 + vite: 7.1.5(@types/node@22.18.8)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + + vitepress-plugin-llms@1.8.0: + dependencies: + gray-matter: 4.0.3 + markdown-it: 14.1.0 + markdown-title: 1.0.2 + mdast-util-from-markdown: 2.0.2 + millify: 6.1.0 + minimatch: 10.0.3 + path-to-regexp: 8.3.0 + picocolors: 1.1.1 + pretty-bytes: 7.0.1 + remark: 15.0.1 + remark-frontmatter: 5.0.0 + tokenx: 1.1.0 + unist-util-remove: 4.0.0 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - supports-color + + vitepress@2.0.0-alpha.12(@types/node@22.18.8)(postcss@8.5.6)(typescript@5.9.2)(yaml@2.8.1): + dependencies: + '@docsearch/css': 4.0.0-beta.7 + '@docsearch/js': 4.0.0-beta.7 + '@iconify-json/simple-icons': 1.2.47 + '@shikijs/core': 3.9.2 + '@shikijs/transformers': 3.9.2 + '@shikijs/types': 3.9.2 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 6.0.1(vite@7.1.5(@types/node@22.18.8)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + '@vue/devtools-api': 8.0.0 + '@vue/shared': 3.5.18 + '@vueuse/core': 13.6.0(vue@3.5.22(typescript@5.9.2)) + '@vueuse/integrations': 13.6.0(focus-trap@7.6.5)(vue@3.5.22(typescript@5.9.2)) + focus-trap: 7.6.5 + mark.js: 8.11.1 + minisearch: 7.1.2 + shiki: 3.9.2 + vite: 7.1.5(@types/node@22.18.8)(yaml@2.8.1) + vue: 3.5.22(typescript@5.9.2) + optionalDependencies: + postcss: 8.5.6 + transitivePeerDependencies: + - '@types/node' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jiti + - jwt-decode + - less + - lightningcss + - nprogress + - qrcode + - sass + - sass-embedded + - sortablejs + - stylus + - sugarss + - terser + - tsx + - typescript + - universal-cookie + - yaml + + vscode-uri@3.1.0: {} + + vue-resize@2.0.0-alpha.1(vue@3.5.22(typescript@5.9.2)): + dependencies: + vue: 3.5.22(typescript@5.9.2) + + vue-tsc@3.1.0(typescript@5.9.2): + dependencies: + '@volar/typescript': 2.4.23 + '@vue/language-core': 3.1.0(typescript@5.9.2) + typescript: 5.9.2 + + vue@3.5.22(typescript@5.9.2): + dependencies: + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-sfc': 3.5.22 + '@vue/runtime-dom': 3.5.22 + '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.9.2)) + '@vue/shared': 3.5.22 + optionalDependencies: + typescript: 5.9.2 + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.1.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write@1.0.3: + dependencies: + mkdirp: 0.5.6 + + xml-js@1.6.11: + dependencies: + sax: 1.4.1 + + y18n@5.0.8: {} + + yallist@2.1.2: {} + + yaml@2.8.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yorkie@2.0.0: + dependencies: + execa: 0.8.0 + is-ci: 1.2.1 + normalize-path: 1.0.0 + strip-indent: 2.0.0 + + zlibjs@0.3.1: {} + + zwitch@1.0.5: {} + + zwitch@2.0.4: {} diff --git a/public/_headers b/public/_headers index 00f819df..5eb5518d 100644 --- a/public/_headers +++ b/public/_headers @@ -9,3 +9,7 @@ /*.png cache-control: max-age=604800 cache-control: immutable + +/*.webp + cache-control: max-age=604800 + cache-control: immutable diff --git a/public/_redirects b/public/_redirects new file mode 100644 index 00000000..34f17f52 --- /dev/null +++ b/public/_redirects @@ -0,0 +1,12 @@ +# temporary, we'll flip this around some day +https://ja.vitejs.dev/* https://ja.vite.dev/:splat 301! + +/guide/api-vite-runtime /guide/api-environment 301 +/guide/api-vite-runtime.html /guide/api-environment 301 +/guide/api-vite-environment /guide/api-environment 301 +/guide/api-vite-environment.html /guide/api-environment 301 +/guide/comparisons /guide/why#how-vite-relates-to-other-unbundled-build-tools 301 +/guide/comparisons.html /guide/why#how-vite-relates-to-other-unbundled-build-tools 301 + +# short links +/rolldown /guide/rolldown 301 diff --git a/public/cypress.svg b/public/cypress.svg deleted file mode 100644 index 9bb6b2f6..00000000 --- a/public/cypress.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/ecosystem-vite4.png b/public/ecosystem-vite4.png deleted file mode 100644 index b0370c04..00000000 Binary files a/public/ecosystem-vite4.png and /dev/null differ diff --git a/public/logo-uwu.webp b/public/logo-uwu.webp new file mode 100644 index 00000000..a413d6cb Binary files /dev/null and b/public/logo-uwu.webp differ diff --git a/public/logo-with-shadow.png b/public/logo-with-shadow.png deleted file mode 100644 index 8b23c919..00000000 Binary files a/public/logo-with-shadow.png and /dev/null differ diff --git a/public/logo-with-shadow.webp b/public/logo-with-shadow.webp new file mode 100644 index 00000000..965e1171 Binary files /dev/null and b/public/logo-with-shadow.webp differ diff --git a/public/og-image-announcing-vite3.png b/public/og-image-announcing-vite3.png deleted file mode 100644 index 859f1bcd..00000000 Binary files a/public/og-image-announcing-vite3.png and /dev/null differ diff --git a/public/og-image-announcing-vite3.webp b/public/og-image-announcing-vite3.webp new file mode 100644 index 00000000..4e293c15 Binary files /dev/null and b/public/og-image-announcing-vite3.webp differ diff --git a/public/og-image-announcing-vite4-3.webp b/public/og-image-announcing-vite4-3.webp new file mode 100644 index 00000000..e770059f Binary files /dev/null and b/public/og-image-announcing-vite4-3.webp differ diff --git a/public/og-image-announcing-vite4.png b/public/og-image-announcing-vite4.png deleted file mode 100644 index 7f8b71f4..00000000 Binary files a/public/og-image-announcing-vite4.png and /dev/null differ diff --git a/public/og-image-announcing-vite4.webp b/public/og-image-announcing-vite4.webp new file mode 100644 index 00000000..d6e86f20 Binary files /dev/null and b/public/og-image-announcing-vite4.webp differ diff --git a/public/og-image-announcing-vite5-1.webp b/public/og-image-announcing-vite5-1.webp new file mode 100644 index 00000000..c5e7d663 Binary files /dev/null and b/public/og-image-announcing-vite5-1.webp differ diff --git a/public/og-image-announcing-vite5.webp b/public/og-image-announcing-vite5.webp new file mode 100644 index 00000000..1a1f6d74 Binary files /dev/null and b/public/og-image-announcing-vite5.webp differ diff --git a/public/og-image-announcing-vite6.webp b/public/og-image-announcing-vite6.webp new file mode 100644 index 00000000..88542425 Binary files /dev/null and b/public/og-image-announcing-vite6.webp differ diff --git a/public/og-image-announcing-vite7.webp b/public/og-image-announcing-vite7.webp new file mode 100644 index 00000000..7f442a79 Binary files /dev/null and b/public/og-image-announcing-vite7.webp differ diff --git a/public/og-image.jpg b/public/og-image.jpg new file mode 100644 index 00000000..ec2e1497 Binary files /dev/null and b/public/og-image.jpg differ diff --git a/public/og-image.png b/public/og-image.png deleted file mode 100644 index 9ae57b08..00000000 Binary files a/public/og-image.png and /dev/null differ diff --git a/public/viteconf.svg b/public/viteconf.svg deleted file mode 100644 index a01c0bd2..00000000 --- a/public/viteconf.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/releases.md b/releases.md new file mode 100644 index 00000000..7f2689e6 --- /dev/null +++ b/releases.md @@ -0,0 +1,61 @@ +# リリース + +Vite のリリースは[セマンティック バージョニング](https://semver.org/)に準拠します。Vite の [npm パッケージページ](https://www.npmjs.com/package/vite)で Vite の最新安定バージョンを確認できます。 + +過去のリリースの完全な変更履歴は [GitHub にて利用できます](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)。 + +## リリースサイクル + +Vite には、一定のリリースサイクルがありません。 + +- **パッチ**リリースは必要に応じてリリースされます(通常は 1 週間ごと)。 +- **マイナー**リリースは常に新しい機能が含まれており、必要に応じてリリースされます。マイナーリリースには常にベータプレリリース段階があります(通常は 2 ヶ月ごと)。 +- **メジャー**リリースは通常 [Node.js の EOL スケジュール](https://endoflife.date/nodejs)に従い、予めアナウンスされます。これらのリリースはエコシステムとの長期的な議論を経て、アルファプレリリース段階とベータプレリリース段階があります(通常は 1 年ごと)。 + +Vite チームがサポートする Vite のバージョン範囲は、以下の通りに自動的に決定されます: + +- **現在のマイナー**は、定期的に修正を受け取ります。 +- **1 つ前のメジャー**(最新のマイナー向けのみ)および **1 つ前のマイナー**は、重要な修正とセキュリティパッチを受け取ります。 +- **最後から 2 番目のメジャー**(その最新のマイナー向けのみ)および**最後から 2 番目のマイナー**は、セキュリティパッチを受け取ります。 +- これらより前のバージョンはすべてサポートされなくなります。 + +例として、Vite の最新バージョンが 5.3.10 の場合: + +- 定期パッチは `vite@5.3` に対してリリースされます。 +- 重要な修正とセキュリティパッチは、`vite@4` と `vite@5.2` にバックポートされます。 +- セキュリティパッチは、`vite@3` と `vite@5.1` にもバックポートされます。 +- `vite@2` および `vite@5.0` はサポートされなくなります。アップデートを受け取るには、ユーザーはアップグレードする必要があります。 + +Vite を定期的にアップデートすることをお勧めします。各メジャーバージョンをアップデートする際には、[移行ガイド](/guide/migration)をご確認ください。Vite チームは、新しいバージョンの品質を確保するために、エコシステムの主要なプロジェクトと緊密に連携しています。Vite チームは、新しい Vite のバージョンをリリースする前に [vite-ecosystem-ci プロジェクト](https://github.com/vitejs/vite-ecosystem-ci)を用いてテストしています。Vite を利用しているほとんどのプロジェクトは、新しいバージョンのリリース後すぐにサポートを提供したり、新しいバージョンに移行したりできるはずです。 + +## セマンティックバージョニングエッジケース + +### TypeScript 定義 + +マイナーバージョンの間で TypeScript 定義に互換性のない変更を出す可能性があります。この理由は: + +- TypeScript 自体がマイナーバージョンの間に互換性のない変更を出すことがあり、TypeScript の新しいバージョンをサポートするために型を調整せざるを得ない可能性があります。 +- まれに TypeScript の新しいバージョンでのみ利用可能な機能を採用する必要が出てくる可能性があり、必要な TypeScript の最小バージョンが引き上げられます。 +- TypeScript を使用している場合、現在のマイナーを固定させる semver 範囲を使うことができ、 Vite の新しいマイナーバージョンが公開されるときに手動でアップグレードすることができます。 + +### esbuild + +[esbuild](https://esbuild.github.io/) は 1.0.0 に達しておらず、新しい機能やパフォーマンス改善を取り込むために、時に破壊的変更を含むことがあります。マイナーバージョンで esbuild のバージョンを上げることがあります。 + +### LTS でない Node.js のバージョン + +LTS でない Node.js のバージョン(奇数のもの)は Vite の CI でテストされていませんが、それらの [EOL](https://endoflife.date/nodejs) 以前では動くはずです。 + +## プレリリース + +マイナーリリースは通常決められていない数のベータ版を通過します。メジャーリリースはアルファ段階とベータ段階を通過します。 + +プレリリースはアーリーアダプターやエコシステムからのメンテナーに統合 / 安定性テストの機会を提供し、フィードバックを受けるために存在します。本番でプレリリースを使用しないでください。すべてのプレリリースは不安定であると取り扱われ、途中で破壊的変更を出す可能性があります。プレリリースを使用するときは常に厳密なバージョンに固定してください。 + +## 非推奨 + +マイナーリリースでより良い代替品に取って代わられた機能を定期的に非推奨にしています。非推奨となった機能は引き続き動作しますが、型やログによる警告が出力されます。これらは非推奨となった後、次のメジャーリリースで削除されます。各メジャーバージョンの[移行ガイド](/guide/migration)にはこれらの削除される機能のリストや代替手段の説明が含まれます。 + +## 実験的機能 + +Vite の安定したバージョンでリリースされる一部の機能は実験的機能と指定されます。実験的機能では実体験を収集し最終的な設計に活用されます。この目的はユーザーに本番でテストしてもらうことでユーザーからのフィードバックを集めることです。実験的機能自体は不安定であると取り扱われ、制御下でのみ使用されるべきです。これらの機能はマイナーの間で変更されることがあるため、ユーザーはこれらの機能を利用する際には Vite のバージョンを固定する必要があります。私たちは各実験的機能ごとに [GitHub Discussion](https://github.com/vitejs/vite/discussions/categories/feedback?discussions_q=is%3Aopen+label%3Aexperimental+category%3AFeedback) を作成します。 diff --git a/team.md b/team.md index f2e80e7c..c17d64e8 100644 --- a/team.md +++ b/team.md @@ -1,7 +1,7 @@ --- layout: page title: チーム紹介 -description: Viteの開発は、国際的なチームによって進められています。 +description: Vite の開発は、国際的なチームによって進められています。 ---