diff --git a/.changeset/chatty-dolls-visit.md b/.changeset/chatty-dolls-visit.md new file mode 100644 index 000000000..6b9e53e88 --- /dev/null +++ b/.changeset/chatty-dolls-visit.md @@ -0,0 +1,5 @@ +--- +'@astrojs/sitemap': minor +--- + +Adds support to SSR routes to sitemap generation. diff --git a/.changeset/friendly-fishes-sing.md b/.changeset/friendly-fishes-sing.md new file mode 100644 index 000000000..9da10e6bf --- /dev/null +++ b/.changeset/friendly-fishes-sing.md @@ -0,0 +1,5 @@ +--- +'astro': minor +--- + +Implement Inline Stylesheets RFC as experimental diff --git a/.changeset/green-cups-hammer.md b/.changeset/green-cups-hammer.md new file mode 100644 index 000000000..1492f8d3c --- /dev/null +++ b/.changeset/green-cups-hammer.md @@ -0,0 +1,21 @@ +--- +'astro': minor +--- + +Implements a new class-based scoping strategy + +This implements the [Scoping RFC](https://github.com/withastro/roadmap/pull/543), providing a way to opt in to increased style specificity for Astro component styles. + +This prevents bugs where global styles override Astro component styles due to CSS ordering and the use of element selectors. + +To enable class-based scoping, you can set it in your config: + +```js +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + scopedStyleStrategy: 'class' +}); +``` + +Note that the 0-specificity `:where` pseudo-selector is still the default strategy. The intent is to change `'class'` to be the default in 3.0. diff --git a/.changeset/nine-geckos-act.md b/.changeset/nine-geckos-act.md new file mode 100644 index 000000000..164dbbfd5 --- /dev/null +++ b/.changeset/nine-geckos-act.md @@ -0,0 +1,5 @@ +--- +'astro': minor +--- + +Support `` to output inline code HTML (no `pre` tag) diff --git a/.changeset/polite-pears-kneel.md b/.changeset/polite-pears-kneel.md deleted file mode 100644 index 2469620ec..000000000 --- a/.changeset/polite-pears-kneel.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@astrojs/telemetry': patch -'@astrojs/webapi': patch ---- - -Upgrade undici to v5.22.0 diff --git a/.changeset/pretty-bears-deliver.md b/.changeset/pretty-bears-deliver.md new file mode 100644 index 000000000..2b8bfc818 --- /dev/null +++ b/.changeset/pretty-bears-deliver.md @@ -0,0 +1,5 @@ +--- +'astro': minor +--- + +New middleware API diff --git a/.changeset/smooth-cows-jog.md b/.changeset/smooth-cows-jog.md new file mode 100644 index 000000000..8c6d4563c --- /dev/null +++ b/.changeset/smooth-cows-jog.md @@ -0,0 +1,8 @@ +--- +'@astrojs/markdoc': patch +'@astrojs/mdx': patch +'@astrojs/markdown-remark': minor +'astro': minor +--- + +Upgrade shiki to v0.14.1. This updates the shiki theme colors and adds the theme name to the `pre` tag, e.g. `
`.
diff --git a/.changeset/tall-news-hang.md b/.changeset/tall-news-hang.md
deleted file mode 100644
index 0887bbec1..000000000
--- a/.changeset/tall-news-hang.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'astro': patch
----
-
-Update `experimental.assets`'s `image.service` configuration to allow for a config option in addition to an entrypoint
diff --git a/.changeset/tidy-singers-thank.md b/.changeset/tidy-singers-thank.md
deleted file mode 100644
index 415679383..000000000
--- a/.changeset/tidy-singers-thank.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@astrojs/cloudflare": patch
----
-
-Fix missing code language in Cloudflare README
diff --git a/.changeset/twelve-feet-switch.md b/.changeset/twelve-feet-switch.md
new file mode 100644
index 000000000..b581fb4c3
--- /dev/null
+++ b/.changeset/twelve-feet-switch.md
@@ -0,0 +1,5 @@
+---
+'astro': patch
+---
+
+Ensure multiple cookies set in dev result in multiple set-cookie headers
diff --git a/.changeset/wise-steaks-wash.md b/.changeset/wise-steaks-wash.md
deleted file mode 100644
index 598059ca0..000000000
--- a/.changeset/wise-steaks-wash.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@astrojs/tailwind': patch
-'@astrojs/svelte': patch
----
-
-Update dependencies
diff --git a/.github/workflows/check-merge.yml b/.github/workflows/check-merge.yml
index 14d1900e3..e31c09bf4 100644
--- a/.github/workflows/check-merge.yml
+++ b/.github/workflows/check-merge.yml
@@ -34,7 +34,7 @@ jobs:
 
       - name: Get changed files in the .changeset folder
         id: changed-files
-        uses: tj-actions/changed-files@v29
+        uses: tj-actions/changed-files@v35
         if: steps.set-blocks.outputs.blocks == ''
         with:
           files: |
@@ -87,5 +87,5 @@ jobs:
           --url https://api.github.com/repos/${{github.repository}}/pulls/${{github.event.number}}/reviews \
           --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' \
           --header 'content-type: application/json' \
-          -d '{"event":"REQUEST_CHANGES"}'
+          -d '{"event":"REQUEST_CHANGES", body: ""}'
 
diff --git a/examples/framework-lit/src/pages/index.astro b/examples/framework-lit/src/pages/index.astro
index 1c7b45ce8..a351b8248 100644
--- a/examples/framework-lit/src/pages/index.astro
+++ b/examples/framework-lit/src/pages/index.astro
@@ -21,12 +21,15 @@ import { MyCounter } from '../components/my-counter.js';
 		
 
 		{
-			/**
-			 * Our VS Code extension does not currently properly typecheck attributes on Lit components
-			 * As such, the following code will result in a TypeScript error inside the editor, nonetheless, it works in Astro!
-			 */
+			(
+				/**
+				 * Our editor tooling does not currently properly typecheck attributes on imported Lit components. As such, without a
+				 * pragma directive telling TypeScript to ignore the error, the line below will result in an error in the editor.
+				 * Nonetheless, this code works in Astro itself!
+				 */
+				// @ts-expect-error
+				
+			)
 		}
-		{/** @ts-expect-error */}
-		
 	
 
diff --git a/examples/middleware/astro.config.mjs b/examples/middleware/astro.config.mjs
new file mode 100644
index 000000000..1d4662423
--- /dev/null
+++ b/examples/middleware/astro.config.mjs
@@ -0,0 +1,13 @@
+import { defineConfig } from 'astro/config';
+import node from '@astrojs/node';
+
+// https://astro.build/config
+export default defineConfig({
+	output: 'server',
+	adapter: node({
+		mode: 'standalone',
+	}),
+	experimental: {
+		middleware: true,
+	},
+});
diff --git a/examples/middleware/package.json b/examples/middleware/package.json
new file mode 100644
index 000000000..0a62e221e
--- /dev/null
+++ b/examples/middleware/package.json
@@ -0,0 +1,23 @@
+{
+  "name": "@example/middleware",
+  "type": "module",
+  "version": "0.0.1",
+  "private": true,
+  "scripts": {
+    "dev": "astro dev",
+    "start": "astro dev",
+    "build": "astro build",
+    "preview": "astro preview",
+    "astro": "astro",
+    "server": "node dist/server/entry.mjs"
+  },
+  "dependencies": {
+    "astro": "workspace:*",
+    "svelte": "^3.48.0",
+    "@astrojs/node": "workspace:*",
+    "concurrently": "^7.2.1",
+    "unocss": "^0.15.6",
+    "vite-imagetools": "^4.0.4",
+    "html-minifier": "^4.0.0"
+  }
+}
diff --git a/examples/middleware/src/components/Card.astro b/examples/middleware/src/components/Card.astro
new file mode 100644
index 000000000..c68fa2ab3
--- /dev/null
+++ b/examples/middleware/src/components/Card.astro
@@ -0,0 +1,63 @@
+---
+export interface Props {
+	title: string;
+	body: string;
+	href: string;
+}
+
+const { href, title, body } = Astro.props;
+---
+
+
+
diff --git a/examples/middleware/src/env.d.ts b/examples/middleware/src/env.d.ts
new file mode 100644
index 000000000..f2de6d45d
--- /dev/null
+++ b/examples/middleware/src/env.d.ts
@@ -0,0 +1,13 @@
+/// 
+declare global {
+	namespace AstroMiddleware {
+		interface Locals {
+			user: {
+				name: string;
+				surname: string;
+			};
+		}
+	}
+}
+
+export {};
diff --git a/examples/middleware/src/layouts/Layout.astro b/examples/middleware/src/layouts/Layout.astro
new file mode 100644
index 000000000..22100824e
--- /dev/null
+++ b/examples/middleware/src/layouts/Layout.astro
@@ -0,0 +1,35 @@
+---
+export interface Props {
+	title: string;
+}
+
+const { title } = Astro.props;
+---
+
+
+
+	
+		
+		
+		
+		
+		{title}
+	
+	
+		
+	
+
+
diff --git a/examples/middleware/src/middleware.ts b/examples/middleware/src/middleware.ts
new file mode 100644
index 000000000..1c0bd855f
--- /dev/null
+++ b/examples/middleware/src/middleware.ts
@@ -0,0 +1,71 @@
+import { defineMiddleware, sequence } from 'astro/middleware';
+import htmlMinifier from 'html-minifier';
+
+const limit = 50;
+
+const loginInfo = {
+	token: undefined,
+	currentTime: undefined,
+};
+
+export const minifier = defineMiddleware(async (context, next) => {
+	const response = await next();
+	// check if the response is returning some HTML
+	if (response.headers.get('content-type') === 'text/html') {
+		let headers = response.headers;
+		let html = await response.text();
+		let newHtml = htmlMinifier.minify(html, {
+			removeAttributeQuotes: true,
+			collapseWhitespace: true,
+		});
+		return new Response(newHtml, {
+			status: 200,
+			headers,
+		});
+	}
+	return response;
+});
+
+const validation = defineMiddleware(async (context, next) => {
+	if (context.request.url.endsWith('/admin')) {
+		if (loginInfo.currentTime) {
+			const difference = new Date().getTime() - loginInfo.currentTime;
+			if (difference > limit) {
+				console.log('hit threshold');
+				loginInfo.token = undefined;
+				loginInfo.currentTime = undefined;
+				return context.redirect('/login');
+			}
+		}
+		// we naively check if we have a token
+		if (loginInfo.token && loginInfo.token === 'loggedIn') {
+			// we fill the locals with user-facing information
+			context.locals.user = {
+				name: 'AstroUser',
+				surname: 'AstroSurname',
+			};
+			return await next();
+		} else {
+			loginInfo.token = undefined;
+			loginInfo.currentTime = undefined;
+			return context.redirect('/login');
+		}
+	} else if (context.request.url.endsWith('/api/login')) {
+		const response = await next();
+		// the login endpoint will return to us a JSON with username and password
+		const data = await response.json();
+		// we naively check if username and password are equals to some string
+		if (data.username === 'astro' && data.password === 'astro') {
+			// we store the token somewhere outside of locals because the `locals` object is attached to the request
+			// and when doing a redirect, we lose that information
+			loginInfo.token = 'loggedIn';
+			loginInfo.currentTime = new Date().getTime();
+			return context.redirect('/admin');
+		}
+	}
+	// we don't really care about awaiting the response in this case
+	next();
+	return;
+});
+
+export const onRequest = sequence(validation, minifier);
diff --git a/examples/middleware/src/pages/admin.astro b/examples/middleware/src/pages/admin.astro
new file mode 100644
index 000000000..028fd6b08
--- /dev/null
+++ b/examples/middleware/src/pages/admin.astro
@@ -0,0 +1,55 @@
+---
+import Layout from '../layouts/Layout.astro';
+const user = Astro.locals.user;
+---
+
+
+	
+

Welcome back {user.name} {user.surname}

+
+
+ + diff --git a/examples/middleware/src/pages/api/login.ts b/examples/middleware/src/pages/api/login.ts new file mode 100644 index 000000000..fa3f7b59b --- /dev/null +++ b/examples/middleware/src/pages/api/login.ts @@ -0,0 +1,18 @@ +import { APIRoute } from 'astro'; + +export const post: APIRoute = async ({ request }) => { + const data = await request.formData(); + const username = data.get('username'); + const password = data.get('password'); + return new Response( + JSON.stringify({ + username, + password, + }), + { + headers: { + 'content-type': 'application/json', + }, + } + ); +}; diff --git a/examples/middleware/src/pages/index.astro b/examples/middleware/src/pages/index.astro new file mode 100644 index 000000000..ff77d4a15 --- /dev/null +++ b/examples/middleware/src/pages/index.astro @@ -0,0 +1,63 @@ +--- +import Layout from '../layouts/Layout.astro'; +import Card from '../components/Card.astro'; +--- + + +
+

Welcome to Astro

+

+ To get started, open the directory src/pages in your project.
+ Code Challenge: Tweak the "Welcome to Astro" message above. +

+ {} + +
+
+ + diff --git a/examples/middleware/src/pages/login.astro b/examples/middleware/src/pages/login.astro new file mode 100644 index 000000000..99cf4cc94 --- /dev/null +++ b/examples/middleware/src/pages/login.astro @@ -0,0 +1,75 @@ +--- +import Layout from '../layouts/Layout.astro'; + +const status = Astro.response.status; +let redirectMessage; +if (status === 301) { + redirectMessage = 'Your session is finished, please login again'; +} +--- + + +
+

Welcome to Astro

+

+ To get started, open the directory src/pages in your project.
+ Code Challenge: Tweak the "Welcome to Astro" message above. +

+ {redirectMessage} +
+ + + + +
+
+
+ + diff --git a/examples/middleware/tsconfig.json b/examples/middleware/tsconfig.json new file mode 100644 index 000000000..d78f81ec4 --- /dev/null +++ b/examples/middleware/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "astro/tsconfigs/base" +} diff --git a/package.json b/package.json index fabf01b44..2ce081cdc 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "eslint-plugin-prettier": "^4.2.1", "only-allow": "^1.1.1", "organize-imports-cli": "^0.10.0", - "prettier": "^2.8.7", + "prettier": "^2.8.8", "prettier-plugin-astro": "^0.8.0", "tiny-glob": "^0.2.9", "turbo": "^1.9.3", diff --git a/packages/astro-rss/CHANGELOG.md b/packages/astro-rss/CHANGELOG.md index cdbf24098..20c712dfa 100644 --- a/packages/astro-rss/CHANGELOG.md +++ b/packages/astro-rss/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/rss +## 2.4.1 + +### Patch Changes + +- [#6970](https://github.com/withastro/astro/pull/6970) [`b5482cee2`](https://github.com/withastro/astro/commit/b5482cee2387149ff397447e546130ba3dea58db) Thanks [@bholmesdev](https://github.com/bholmesdev)! - Fix: remove accidental stripping of trailing `/1/` on canonical URLs + ## 2.4.0 ### Minor Changes diff --git a/packages/astro-rss/package.json b/packages/astro-rss/package.json index 21b07e2fb..52051b32d 100644 --- a/packages/astro-rss/package.json +++ b/packages/astro-rss/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/rss", "description": "Add RSS feeds to your Astro projects", - "version": "2.4.0", + "version": "2.4.1", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/packages/astro-rss/src/util.ts b/packages/astro-rss/src/util.ts index 63a8c5568..e40301a4c 100644 --- a/packages/astro-rss/src/util.ts +++ b/packages/astro-rss/src/util.ts @@ -8,7 +8,6 @@ export function createCanonicalURL( base?: string ): URL { let pathname = url.replace(/\/index.html$/, ''); // index.html is not canonical - pathname = pathname.replace(/\/1\/?$/, ''); // neither is a trailing /1/ (impl. detail of collections) if (trailingSlash === false) { // remove the trailing slash pathname = pathname.replace(/(\/+)?$/, ''); diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index ab0dc88b2..0ce75e341 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,39 @@ # astro +## 2.3.4 + +### Patch Changes + +- [#6967](https://github.com/withastro/astro/pull/6967) [`a8a319aef`](https://github.com/withastro/astro/commit/a8a319aef744a64647ee16c7d558d74de6864c6c) Thanks [@bluwy](https://github.com/bluwy)! - Fix `astro-entry` error on build with multiple JSX frameworks + +- [#6961](https://github.com/withastro/astro/pull/6961) [`a695e44ae`](https://github.com/withastro/astro/commit/a695e44aed6e2f5d32cb950d4237be6e5657ba98) Thanks [@Princesseuh](https://github.com/Princesseuh)! - Fix getImage type + +- [#6956](https://github.com/withastro/astro/pull/6956) [`367e61776`](https://github.com/withastro/astro/commit/367e61776196a17d61c28daa4dfbabb6244e040c) Thanks [@lilnasy](https://github.com/lilnasy)! - Changed where various parts of the build pipeline look to decide if a page should be prerendered. They now exclusively consider PageBuildData, allowing integrations to participate in the decision. + +- [#6969](https://github.com/withastro/astro/pull/6969) [`77270cc2c`](https://github.com/withastro/astro/commit/77270cc2cd06c942d7abf1d882e36d9163edafa5) Thanks [@bluwy](https://github.com/bluwy)! - Avoid removing leading slash for `build.assetsPrefix` value in the build output + +- [#6910](https://github.com/withastro/astro/pull/6910) [`895fa07d8`](https://github.com/withastro/astro/commit/895fa07d8b4b8359984e048daca5437e40f44390) Thanks [@natemoo-re](https://github.com/natemoo-re)! - Inline `process.env` boolean values (`0`, `1`, `true`, `false`) during the build. This helps with DCE and allows for better `export const prerender` detection. + +- [#6958](https://github.com/withastro/astro/pull/6958) [`72c6bf01f`](https://github.com/withastro/astro/commit/72c6bf01fe49b331ca8ad9206a7506b15caf5b8d) Thanks [@bluwy](https://github.com/bluwy)! - Fix content render imports flow + +- [#6952](https://github.com/withastro/astro/pull/6952) [`e5bd084c0`](https://github.com/withastro/astro/commit/e5bd084c01e4f60a157969b50c05ce002f7b63d2) Thanks [@Princesseuh](https://github.com/Princesseuh)! - Update allowed Sharp versions to support 0.32.0 + +## 2.3.3 + +### Patch Changes + +- [#6940](https://github.com/withastro/astro/pull/6940) [`a98df9374`](https://github.com/withastro/astro/commit/a98df9374dec65c678fa47319cb1481b1af123e2) Thanks [@delucis](https://github.com/delucis)! - Support custom 404s added via `injectRoute` or as `src/pages/404.html` + +- [#6948](https://github.com/withastro/astro/pull/6948) [`50975f2ea`](https://github.com/withastro/astro/commit/50975f2ea3a59f9e023cc631a9372c0c7986eec9) Thanks [@imchell](https://github.com/imchell)! - Placeholders for slots are cleaned in HTML String that is rendered + +- [#6848](https://github.com/withastro/astro/pull/6848) [`ebae1eaf8`](https://github.com/withastro/astro/commit/ebae1eaf87f49399036033c673b513338f7d9c42) Thanks [@Princesseuh](https://github.com/Princesseuh)! - Update `experimental.assets`'s `image.service` configuration to allow for a config option in addition to an entrypoint + +- [#6953](https://github.com/withastro/astro/pull/6953) [`dc062f669`](https://github.com/withastro/astro/commit/dc062f6695ce577dc569781fc0678c903012c336) Thanks [@Princesseuh](https://github.com/Princesseuh)! - Update `astro check` to use version 1.0.0 of the Astro language server + +- Updated dependencies [[`ac57b5549`](https://github.com/withastro/astro/commit/ac57b5549f828a17bdbebdaca7ace075307a3c9d)]: + - @astrojs/telemetry@2.1.1 + - @astrojs/webapi@2.1.1 + ## 2.3.2 ### Patch Changes diff --git a/packages/astro/client-base.d.ts b/packages/astro/client-base.d.ts index 52bd5870f..6e37b60c7 100644 --- a/packages/astro/client-base.d.ts +++ b/packages/astro/client-base.d.ts @@ -3,7 +3,26 @@ declare module 'astro:assets' { // Exporting things one by one is a bit cumbersome, not sure if there's a better way - erika, 2023-02-03 type AstroAssets = { - getImage: typeof import('./dist/assets/index.js').getImage; + // getImage's type here is different from the internal function since the Vite module implicitly pass the service config + /** + * Get an optimized image and the necessary attributes to render it. + * + * **Example** + * ```astro + * --- + * import { getImage } from 'astro:assets'; + * import originalImage from '../assets/image.png'; + * + * const optimizedImage = await getImage({src: originalImage, width: 1280 }); + * --- + * + * ``` + * + * This is functionally equivalent to using the `` component, as the component calls this function internally. + */ + getImage: ( + options: import('./dist/assets/types.js').ImageTransform + ) => Promise; getConfiguredImageService: typeof import('./dist/assets/index.js').getConfiguredImageService; Image: typeof import('./components/Image.astro').default; }; @@ -368,3 +387,9 @@ declare module '*?inline' { const src: string; export default src; } + +// eslint-disable-next-line @typescript-eslint/no-namespace +export namespace App { + // eslint-disable-next-line @typescript-eslint/no-empty-interface + export interface Locals {} +} diff --git a/packages/astro/components/Code.astro b/packages/astro/components/Code.astro index 0c5f946af..40f99bcd1 100644 --- a/packages/astro/components/Code.astro +++ b/packages/astro/components/Code.astro @@ -1,5 +1,6 @@ --- import type * as shiki from 'shiki'; +import { renderToHtml } from 'shiki'; import { getHighlighter } from './Shiki.js'; export interface Props { @@ -30,36 +31,60 @@ export interface Props { * @default false */ wrap?: boolean | null; + /** + * Generate inline code element only, without the pre element wrapper. + * + * @default false + */ + inline?: boolean; } -const { code, lang = 'plaintext', theme = 'github-dark', wrap = false } = Astro.props; - -/** Replace the shiki class name with a custom astro class name. */ -function repairShikiTheme(html: string): string { - // Replace "shiki" class naming with "astro" - html = html.replace(/
${children}`;
+		},
+		code({ children }) {
+			return inline ? children : `${children}`;
+		},
+	},
 });
-const html = repairShikiTheme(_html);
 ---
 
 
diff --git a/packages/astro/components/shiki-languages.js b/packages/astro/components/shiki-languages.js
index 4bb3d4498..2fcbc407a 100644
--- a/packages/astro/components/shiki-languages.js
+++ b/packages/astro/components/shiki-languages.js
@@ -1,2020 +1,176 @@
+/**
+ * This file is prebuilt from packages/astro/scripts/shiki-gen-languages.mjs
+ * Do not edit this directly, but instead edit that file and rerun it to generate this file.
+ */
+
 import { BUNDLED_LANGUAGES } from 'shiki';
 
+function handleLang(grammar, language) {
+	const lang = BUNDLED_LANGUAGES.find((l) => l.id === language);
+	if (lang) {
+		return {
+			...lang,
+			grammar,
+		};
+	} else {
+		return undefined;
+	}
+}
+
+// prettier-ignore
 export const languages = {
-	abap: () =>
-		import('shiki/languages/abap.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'abap');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	'actionscript-3': () =>
-		import('shiki/languages/actionscript-3.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'actionscript-3');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	ada: () =>
-		import('shiki/languages/ada.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'ada');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	apache: () =>
-		import('shiki/languages/apache.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'apache');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	apex: () =>
-		import('shiki/languages/apex.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'apex');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	apl: () =>
-		import('shiki/languages/apl.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'apl');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	applescript: () =>
-		import('shiki/languages/applescript.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'applescript');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	asm: () =>
-		import('shiki/languages/asm.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'asm');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	astro: () =>
-		import('shiki/languages/astro.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'astro');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	awk: () =>
-		import('shiki/languages/awk.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'awk');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	ballerina: () =>
-		import('shiki/languages/ballerina.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'ballerina');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	bat: () =>
-		import('shiki/languages/bat.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'bat');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	berry: () =>
-		import('shiki/languages/berry.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'berry');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	bibtex: () =>
-		import('shiki/languages/bibtex.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'bibtex');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	bicep: () =>
-		import('shiki/languages/bicep.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'bicep');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	blade: () =>
-		import('shiki/languages/blade.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'blade');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	c: () =>
-		import('shiki/languages/c.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'c');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	cadence: () =>
-		import('shiki/languages/cadence.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'cadence');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	clarity: () =>
-		import('shiki/languages/clarity.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'clarity');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	clojure: () =>
-		import('shiki/languages/clojure.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'clojure');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	cmake: () =>
-		import('shiki/languages/cmake.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'cmake');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	cobol: () =>
-		import('shiki/languages/cobol.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'cobol');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	codeql: () =>
-		import('shiki/languages/codeql.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'codeql');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	coffee: () =>
-		import('shiki/languages/coffee.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'coffee');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	'cpp-macro': () =>
-		import('shiki/languages/cpp-macro.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'cpp-macro');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	cpp: () =>
-		import('shiki/languages/cpp.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'cpp');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	crystal: () =>
-		import('shiki/languages/crystal.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'crystal');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	csharp: () =>
-		import('shiki/languages/csharp.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'csharp');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	css: () =>
-		import('shiki/languages/css.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'css');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	cue: () =>
-		import('shiki/languages/cue.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'cue');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	d: () =>
-		import('shiki/languages/d.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'd');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	dart: () =>
-		import('shiki/languages/dart.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'dart');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	diff: () =>
-		import('shiki/languages/diff.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'diff');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	docker: () =>
-		import('shiki/languages/docker.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'docker');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	'dream-maker': () =>
-		import('shiki/languages/dream-maker.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'dream-maker');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	elixir: () =>
-		import('shiki/languages/elixir.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'elixir');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	elm: () =>
-		import('shiki/languages/elm.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'elm');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	erb: () =>
-		import('shiki/languages/erb.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'erb');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	erlang: () =>
-		import('shiki/languages/erlang.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'erlang');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	fish: () =>
-		import('shiki/languages/fish.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'fish');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	fsharp: () =>
-		import('shiki/languages/fsharp.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'fsharp');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	gherkin: () =>
-		import('shiki/languages/gherkin.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'gherkin');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	'git-commit': () =>
-		import('shiki/languages/git-commit.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'git-commit');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	'git-rebase': () =>
-		import('shiki/languages/git-rebase.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'git-rebase');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	glsl: () =>
-		import('shiki/languages/glsl.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'glsl');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	gnuplot: () =>
-		import('shiki/languages/gnuplot.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'gnuplot');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	go: () =>
-		import('shiki/languages/go.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'go');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	graphql: () =>
-		import('shiki/languages/graphql.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'graphql');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	groovy: () =>
-		import('shiki/languages/groovy.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'groovy');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	hack: () =>
-		import('shiki/languages/hack.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'hack');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	haml: () =>
-		import('shiki/languages/haml.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'haml');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	handlebars: () =>
-		import('shiki/languages/handlebars.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'handlebars');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	haskell: () =>
-		import('shiki/languages/haskell.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'haskell');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	hcl: () =>
-		import('shiki/languages/hcl.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'hcl');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	hlsl: () =>
-		import('shiki/languages/hlsl.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'hlsl');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	html: () =>
-		import('shiki/languages/html.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'html');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	ini: () =>
-		import('shiki/languages/ini.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'ini');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	java: () =>
-		import('shiki/languages/java.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'java');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	javascript: () =>
-		import('shiki/languages/javascript.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'javascript');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	'jinja-html': () =>
-		import('shiki/languages/jinja-html.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'jinja-html');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	jinja: () =>
-		import('shiki/languages/jinja.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'jinja');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	json: () =>
-		import('shiki/languages/json.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'json');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	jsonc: () =>
-		import('shiki/languages/jsonc.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'jsonc');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	jsonnet: () =>
-		import('shiki/languages/jsonnet.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'jsonnet');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	jssm: () =>
-		import('shiki/languages/jssm.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'jssm');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	jsx: () =>
-		import('shiki/languages/jsx.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'jsx');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	julia: () =>
-		import('shiki/languages/julia.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'julia');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	kotlin: () =>
-		import('shiki/languages/kotlin.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'kotlin');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	latex: () =>
-		import('shiki/languages/latex.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'latex');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	less: () =>
-		import('shiki/languages/less.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'less');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	liquid: () =>
-		import('shiki/languages/liquid.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'liquid');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	lisp: () =>
-		import('shiki/languages/lisp.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'lisp');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	logo: () =>
-		import('shiki/languages/logo.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'logo');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	lua: () =>
-		import('shiki/languages/lua.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'lua');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	make: () =>
-		import('shiki/languages/make.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'make');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	markdown: () =>
-		import('shiki/languages/markdown.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'markdown');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	marko: () =>
-		import('shiki/languages/marko.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'marko');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	matlab: () =>
-		import('shiki/languages/matlab.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'matlab');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	mdx: () =>
-		import('shiki/languages/mdx.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'mdx');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	mermaid: () =>
-		import('shiki/languages/mermaid.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'mermaid');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	nginx: () =>
-		import('shiki/languages/nginx.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'nginx');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	nim: () =>
-		import('shiki/languages/nim.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'nim');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	nix: () =>
-		import('shiki/languages/nix.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'nix');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	'objective-c': () =>
-		import('shiki/languages/objective-c.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'objective-c');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	'objective-cpp': () =>
-		import('shiki/languages/objective-cpp.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'objective-cpp');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	ocaml: () =>
-		import('shiki/languages/ocaml.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'ocaml');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	pascal: () =>
-		import('shiki/languages/pascal.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'pascal');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	perl: () =>
-		import('shiki/languages/perl.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'perl');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	'php-html': () =>
-		import('shiki/languages/php-html.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'php-html');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	php: () =>
-		import('shiki/languages/php.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'php');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	plsql: () =>
-		import('shiki/languages/plsql.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'plsql');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	postcss: () =>
-		import('shiki/languages/postcss.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'postcss');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	powershell: () =>
-		import('shiki/languages/powershell.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'powershell');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	prisma: () =>
-		import('shiki/languages/prisma.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'prisma');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	prolog: () =>
-		import('shiki/languages/prolog.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'prolog');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	pug: () =>
-		import('shiki/languages/pug.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'pug');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	puppet: () =>
-		import('shiki/languages/puppet.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'puppet');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	purescript: () =>
-		import('shiki/languages/purescript.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'purescript');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	python: () =>
-		import('shiki/languages/python.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'python');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	r: () =>
-		import('shiki/languages/r.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'r');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	raku: () =>
-		import('shiki/languages/raku.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'raku');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	razor: () =>
-		import('shiki/languages/razor.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'razor');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	rel: () =>
-		import('shiki/languages/rel.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'rel');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	riscv: () =>
-		import('shiki/languages/riscv.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'riscv');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	rst: () =>
-		import('shiki/languages/rst.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'rst');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	ruby: () =>
-		import('shiki/languages/ruby.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'ruby');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	rust: () =>
-		import('shiki/languages/rust.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'rust');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	sas: () =>
-		import('shiki/languages/sas.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'sas');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	sass: () =>
-		import('shiki/languages/sass.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'sass');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	scala: () =>
-		import('shiki/languages/scala.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'scala');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	scheme: () =>
-		import('shiki/languages/scheme.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'scheme');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	scss: () =>
-		import('shiki/languages/scss.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'scss');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	shaderlab: () =>
-		import('shiki/languages/shaderlab.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'shaderlab');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	shellscript: () =>
-		import('shiki/languages/shellscript.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'shellscript');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	smalltalk: () =>
-		import('shiki/languages/smalltalk.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'smalltalk');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	solidity: () =>
-		import('shiki/languages/solidity.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'solidity');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	sparql: () =>
-		import('shiki/languages/sparql.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'sparql');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	sql: () =>
-		import('shiki/languages/sql.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'sql');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	'ssh-config': () =>
-		import('shiki/languages/ssh-config.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'ssh-config');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	stata: () =>
-		import('shiki/languages/stata.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'stata');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	stylus: () =>
-		import('shiki/languages/stylus.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'stylus');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	svelte: () =>
-		import('shiki/languages/svelte.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'svelte');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	swift: () =>
-		import('shiki/languages/swift.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'swift');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	'system-verilog': () =>
-		import('shiki/languages/system-verilog.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'system-verilog');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	tasl: () =>
-		import('shiki/languages/tasl.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'tasl');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	tcl: () =>
-		import('shiki/languages/tcl.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'tcl');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	tex: () =>
-		import('shiki/languages/tex.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'tex');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	toml: () =>
-		import('shiki/languages/toml.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'toml');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	tsx: () =>
-		import('shiki/languages/tsx.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'tsx');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	turtle: () =>
-		import('shiki/languages/turtle.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'turtle');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	twig: () =>
-		import('shiki/languages/twig.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'twig');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	typescript: () =>
-		import('shiki/languages/typescript.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'typescript');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	vb: () =>
-		import('shiki/languages/vb.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'vb');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	verilog: () =>
-		import('shiki/languages/verilog.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'verilog');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	vhdl: () =>
-		import('shiki/languages/vhdl.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'vhdl');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	viml: () =>
-		import('shiki/languages/viml.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'viml');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	'vue-html': () =>
-		import('shiki/languages/vue-html.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'vue-html');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	vue: () =>
-		import('shiki/languages/vue.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'vue');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	wasm: () =>
-		import('shiki/languages/wasm.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'wasm');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	wenyan: () =>
-		import('shiki/languages/wenyan.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'wenyan');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	xml: () =>
-		import('shiki/languages/xml.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'xml');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	xsl: () =>
-		import('shiki/languages/xsl.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'xsl');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	yaml: () =>
-		import('shiki/languages/yaml.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'yaml');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
-	zenscript: () =>
-		import('shiki/languages/zenscript.tmLanguage.json')
-			.then((mod) => mod.default)
-			.then((grammar) => {
-				const lang = BUNDLED_LANGUAGES.find((l) => l.id === 'zenscript');
-				if (lang) {
-					return {
-						...lang,
-						grammar,
-					};
-				} else {
-					return undefined;
-				}
-			}),
+	'abap': () => import('shiki/languages/abap.tmLanguage.json').then((mod) => handleLang(mod.default, 'abap')),
+	'actionscript-3': () => import('shiki/languages/actionscript-3.tmLanguage.json').then((mod) => handleLang(mod.default, 'actionscript-3')),
+	'ada': () => import('shiki/languages/ada.tmLanguage.json').then((mod) => handleLang(mod.default, 'ada')),
+	'apache': () => import('shiki/languages/apache.tmLanguage.json').then((mod) => handleLang(mod.default, 'apache')),
+	'apex': () => import('shiki/languages/apex.tmLanguage.json').then((mod) => handleLang(mod.default, 'apex')),
+	'apl': () => import('shiki/languages/apl.tmLanguage.json').then((mod) => handleLang(mod.default, 'apl')),
+	'applescript': () => import('shiki/languages/applescript.tmLanguage.json').then((mod) => handleLang(mod.default, 'applescript')),
+	'ara': () => import('shiki/languages/ara.tmLanguage.json').then((mod) => handleLang(mod.default, 'ara')),
+	'asm': () => import('shiki/languages/asm.tmLanguage.json').then((mod) => handleLang(mod.default, 'asm')),
+	'astro': () => import('shiki/languages/astro.tmLanguage.json').then((mod) => handleLang(mod.default, 'astro')),
+	'awk': () => import('shiki/languages/awk.tmLanguage.json').then((mod) => handleLang(mod.default, 'awk')),
+	'ballerina': () => import('shiki/languages/ballerina.tmLanguage.json').then((mod) => handleLang(mod.default, 'ballerina')),
+	'bat': () => import('shiki/languages/bat.tmLanguage.json').then((mod) => handleLang(mod.default, 'bat')),
+	'berry': () => import('shiki/languages/berry.tmLanguage.json').then((mod) => handleLang(mod.default, 'berry')),
+	'bibtex': () => import('shiki/languages/bibtex.tmLanguage.json').then((mod) => handleLang(mod.default, 'bibtex')),
+	'bicep': () => import('shiki/languages/bicep.tmLanguage.json').then((mod) => handleLang(mod.default, 'bicep')),
+	'blade': () => import('shiki/languages/blade.tmLanguage.json').then((mod) => handleLang(mod.default, 'blade')),
+	'c': () => import('shiki/languages/c.tmLanguage.json').then((mod) => handleLang(mod.default, 'c')),
+	'cadence': () => import('shiki/languages/cadence.tmLanguage.json').then((mod) => handleLang(mod.default, 'cadence')),
+	'clarity': () => import('shiki/languages/clarity.tmLanguage.json').then((mod) => handleLang(mod.default, 'clarity')),
+	'clojure': () => import('shiki/languages/clojure.tmLanguage.json').then((mod) => handleLang(mod.default, 'clojure')),
+	'cmake': () => import('shiki/languages/cmake.tmLanguage.json').then((mod) => handleLang(mod.default, 'cmake')),
+	'cobol': () => import('shiki/languages/cobol.tmLanguage.json').then((mod) => handleLang(mod.default, 'cobol')),
+	'codeql': () => import('shiki/languages/codeql.tmLanguage.json').then((mod) => handleLang(mod.default, 'codeql')),
+	'coffee': () => import('shiki/languages/coffee.tmLanguage.json').then((mod) => handleLang(mod.default, 'coffee')),
+	'cpp-macro': () => import('shiki/languages/cpp-macro.tmLanguage.json').then((mod) => handleLang(mod.default, 'cpp-macro')),
+	'cpp': () => import('shiki/languages/cpp.tmLanguage.json').then((mod) => handleLang(mod.default, 'cpp')),
+	'crystal': () => import('shiki/languages/crystal.tmLanguage.json').then((mod) => handleLang(mod.default, 'crystal')),
+	'csharp': () => import('shiki/languages/csharp.tmLanguage.json').then((mod) => handleLang(mod.default, 'csharp')),
+	'css': () => import('shiki/languages/css.tmLanguage.json').then((mod) => handleLang(mod.default, 'css')),
+	'cue': () => import('shiki/languages/cue.tmLanguage.json').then((mod) => handleLang(mod.default, 'cue')),
+	'd': () => import('shiki/languages/d.tmLanguage.json').then((mod) => handleLang(mod.default, 'd')),
+	'dart': () => import('shiki/languages/dart.tmLanguage.json').then((mod) => handleLang(mod.default, 'dart')),
+	'dax': () => import('shiki/languages/dax.tmLanguage.json').then((mod) => handleLang(mod.default, 'dax')),
+	'diff': () => import('shiki/languages/diff.tmLanguage.json').then((mod) => handleLang(mod.default, 'diff')),
+	'docker': () => import('shiki/languages/docker.tmLanguage.json').then((mod) => handleLang(mod.default, 'docker')),
+	'dream-maker': () => import('shiki/languages/dream-maker.tmLanguage.json').then((mod) => handleLang(mod.default, 'dream-maker')),
+	'elixir': () => import('shiki/languages/elixir.tmLanguage.json').then((mod) => handleLang(mod.default, 'elixir')),
+	'elm': () => import('shiki/languages/elm.tmLanguage.json').then((mod) => handleLang(mod.default, 'elm')),
+	'erb': () => import('shiki/languages/erb.tmLanguage.json').then((mod) => handleLang(mod.default, 'erb')),
+	'erlang': () => import('shiki/languages/erlang.tmLanguage.json').then((mod) => handleLang(mod.default, 'erlang')),
+	'fish': () => import('shiki/languages/fish.tmLanguage.json').then((mod) => handleLang(mod.default, 'fish')),
+	'fsharp': () => import('shiki/languages/fsharp.tmLanguage.json').then((mod) => handleLang(mod.default, 'fsharp')),
+	'gherkin': () => import('shiki/languages/gherkin.tmLanguage.json').then((mod) => handleLang(mod.default, 'gherkin')),
+	'git-commit': () => import('shiki/languages/git-commit.tmLanguage.json').then((mod) => handleLang(mod.default, 'git-commit')),
+	'git-rebase': () => import('shiki/languages/git-rebase.tmLanguage.json').then((mod) => handleLang(mod.default, 'git-rebase')),
+	'glsl': () => import('shiki/languages/glsl.tmLanguage.json').then((mod) => handleLang(mod.default, 'glsl')),
+	'gnuplot': () => import('shiki/languages/gnuplot.tmLanguage.json').then((mod) => handleLang(mod.default, 'gnuplot')),
+	'go': () => import('shiki/languages/go.tmLanguage.json').then((mod) => handleLang(mod.default, 'go')),
+	'graphql': () => import('shiki/languages/graphql.tmLanguage.json').then((mod) => handleLang(mod.default, 'graphql')),
+	'groovy': () => import('shiki/languages/groovy.tmLanguage.json').then((mod) => handleLang(mod.default, 'groovy')),
+	'hack': () => import('shiki/languages/hack.tmLanguage.json').then((mod) => handleLang(mod.default, 'hack')),
+	'haml': () => import('shiki/languages/haml.tmLanguage.json').then((mod) => handleLang(mod.default, 'haml')),
+	'handlebars': () => import('shiki/languages/handlebars.tmLanguage.json').then((mod) => handleLang(mod.default, 'handlebars')),
+	'haskell': () => import('shiki/languages/haskell.tmLanguage.json').then((mod) => handleLang(mod.default, 'haskell')),
+	'hcl': () => import('shiki/languages/hcl.tmLanguage.json').then((mod) => handleLang(mod.default, 'hcl')),
+	'hlsl': () => import('shiki/languages/hlsl.tmLanguage.json').then((mod) => handleLang(mod.default, 'hlsl')),
+	'html': () => import('shiki/languages/html.tmLanguage.json').then((mod) => handleLang(mod.default, 'html')),
+	'http': () => import('shiki/languages/http.tmLanguage.json').then((mod) => handleLang(mod.default, 'http')),
+	'imba': () => import('shiki/languages/imba.tmLanguage.json').then((mod) => handleLang(mod.default, 'imba')),
+	'ini': () => import('shiki/languages/ini.tmLanguage.json').then((mod) => handleLang(mod.default, 'ini')),
+	'java': () => import('shiki/languages/java.tmLanguage.json').then((mod) => handleLang(mod.default, 'java')),
+	'javascript': () => import('shiki/languages/javascript.tmLanguage.json').then((mod) => handleLang(mod.default, 'javascript')),
+	'jinja-html': () => import('shiki/languages/jinja-html.tmLanguage.json').then((mod) => handleLang(mod.default, 'jinja-html')),
+	'jinja': () => import('shiki/languages/jinja.tmLanguage.json').then((mod) => handleLang(mod.default, 'jinja')),
+	'jison': () => import('shiki/languages/jison.tmLanguage.json').then((mod) => handleLang(mod.default, 'jison')),
+	'json': () => import('shiki/languages/json.tmLanguage.json').then((mod) => handleLang(mod.default, 'json')),
+	'json5': () => import('shiki/languages/json5.tmLanguage.json').then((mod) => handleLang(mod.default, 'json5')),
+	'jsonc': () => import('shiki/languages/jsonc.tmLanguage.json').then((mod) => handleLang(mod.default, 'jsonc')),
+	'jsonnet': () => import('shiki/languages/jsonnet.tmLanguage.json').then((mod) => handleLang(mod.default, 'jsonnet')),
+	'jssm': () => import('shiki/languages/jssm.tmLanguage.json').then((mod) => handleLang(mod.default, 'jssm')),
+	'jsx': () => import('shiki/languages/jsx.tmLanguage.json').then((mod) => handleLang(mod.default, 'jsx')),
+	'julia': () => import('shiki/languages/julia.tmLanguage.json').then((mod) => handleLang(mod.default, 'julia')),
+	'kotlin': () => import('shiki/languages/kotlin.tmLanguage.json').then((mod) => handleLang(mod.default, 'kotlin')),
+	'latex': () => import('shiki/languages/latex.tmLanguage.json').then((mod) => handleLang(mod.default, 'latex')),
+	'less': () => import('shiki/languages/less.tmLanguage.json').then((mod) => handleLang(mod.default, 'less')),
+	'liquid': () => import('shiki/languages/liquid.tmLanguage.json').then((mod) => handleLang(mod.default, 'liquid')),
+	'lisp': () => import('shiki/languages/lisp.tmLanguage.json').then((mod) => handleLang(mod.default, 'lisp')),
+	'logo': () => import('shiki/languages/logo.tmLanguage.json').then((mod) => handleLang(mod.default, 'logo')),
+	'lua': () => import('shiki/languages/lua.tmLanguage.json').then((mod) => handleLang(mod.default, 'lua')),
+	'make': () => import('shiki/languages/make.tmLanguage.json').then((mod) => handleLang(mod.default, 'make')),
+	'markdown': () => import('shiki/languages/markdown.tmLanguage.json').then((mod) => handleLang(mod.default, 'markdown')),
+	'marko': () => import('shiki/languages/marko.tmLanguage.json').then((mod) => handleLang(mod.default, 'marko')),
+	'matlab': () => import('shiki/languages/matlab.tmLanguage.json').then((mod) => handleLang(mod.default, 'matlab')),
+	'mdx': () => import('shiki/languages/mdx.tmLanguage.json').then((mod) => handleLang(mod.default, 'mdx')),
+	'mermaid': () => import('shiki/languages/mermaid.tmLanguage.json').then((mod) => handleLang(mod.default, 'mermaid')),
+	'nginx': () => import('shiki/languages/nginx.tmLanguage.json').then((mod) => handleLang(mod.default, 'nginx')),
+	'nim': () => import('shiki/languages/nim.tmLanguage.json').then((mod) => handleLang(mod.default, 'nim')),
+	'nix': () => import('shiki/languages/nix.tmLanguage.json').then((mod) => handleLang(mod.default, 'nix')),
+	'objective-c': () => import('shiki/languages/objective-c.tmLanguage.json').then((mod) => handleLang(mod.default, 'objective-c')),
+	'objective-cpp': () => import('shiki/languages/objective-cpp.tmLanguage.json').then((mod) => handleLang(mod.default, 'objective-cpp')),
+	'ocaml': () => import('shiki/languages/ocaml.tmLanguage.json').then((mod) => handleLang(mod.default, 'ocaml')),
+	'pascal': () => import('shiki/languages/pascal.tmLanguage.json').then((mod) => handleLang(mod.default, 'pascal')),
+	'perl': () => import('shiki/languages/perl.tmLanguage.json').then((mod) => handleLang(mod.default, 'perl')),
+	'php-html': () => import('shiki/languages/php-html.tmLanguage.json').then((mod) => handleLang(mod.default, 'php-html')),
+	'php': () => import('shiki/languages/php.tmLanguage.json').then((mod) => handleLang(mod.default, 'php')),
+	'plsql': () => import('shiki/languages/plsql.tmLanguage.json').then((mod) => handleLang(mod.default, 'plsql')),
+	'postcss': () => import('shiki/languages/postcss.tmLanguage.json').then((mod) => handleLang(mod.default, 'postcss')),
+	'powerquery': () => import('shiki/languages/powerquery.tmLanguage.json').then((mod) => handleLang(mod.default, 'powerquery')),
+	'powershell': () => import('shiki/languages/powershell.tmLanguage.json').then((mod) => handleLang(mod.default, 'powershell')),
+	'prisma': () => import('shiki/languages/prisma.tmLanguage.json').then((mod) => handleLang(mod.default, 'prisma')),
+	'prolog': () => import('shiki/languages/prolog.tmLanguage.json').then((mod) => handleLang(mod.default, 'prolog')),
+	'proto': () => import('shiki/languages/proto.tmLanguage.json').then((mod) => handleLang(mod.default, 'proto')),
+	'pug': () => import('shiki/languages/pug.tmLanguage.json').then((mod) => handleLang(mod.default, 'pug')),
+	'puppet': () => import('shiki/languages/puppet.tmLanguage.json').then((mod) => handleLang(mod.default, 'puppet')),
+	'purescript': () => import('shiki/languages/purescript.tmLanguage.json').then((mod) => handleLang(mod.default, 'purescript')),
+	'python': () => import('shiki/languages/python.tmLanguage.json').then((mod) => handleLang(mod.default, 'python')),
+	'r': () => import('shiki/languages/r.tmLanguage.json').then((mod) => handleLang(mod.default, 'r')),
+	'raku': () => import('shiki/languages/raku.tmLanguage.json').then((mod) => handleLang(mod.default, 'raku')),
+	'razor': () => import('shiki/languages/razor.tmLanguage.json').then((mod) => handleLang(mod.default, 'razor')),
+	'rel': () => import('shiki/languages/rel.tmLanguage.json').then((mod) => handleLang(mod.default, 'rel')),
+	'riscv': () => import('shiki/languages/riscv.tmLanguage.json').then((mod) => handleLang(mod.default, 'riscv')),
+	'rst': () => import('shiki/languages/rst.tmLanguage.json').then((mod) => handleLang(mod.default, 'rst')),
+	'ruby': () => import('shiki/languages/ruby.tmLanguage.json').then((mod) => handleLang(mod.default, 'ruby')),
+	'rust': () => import('shiki/languages/rust.tmLanguage.json').then((mod) => handleLang(mod.default, 'rust')),
+	'sas': () => import('shiki/languages/sas.tmLanguage.json').then((mod) => handleLang(mod.default, 'sas')),
+	'sass': () => import('shiki/languages/sass.tmLanguage.json').then((mod) => handleLang(mod.default, 'sass')),
+	'scala': () => import('shiki/languages/scala.tmLanguage.json').then((mod) => handleLang(mod.default, 'scala')),
+	'scheme': () => import('shiki/languages/scheme.tmLanguage.json').then((mod) => handleLang(mod.default, 'scheme')),
+	'scss': () => import('shiki/languages/scss.tmLanguage.json').then((mod) => handleLang(mod.default, 'scss')),
+	'shaderlab': () => import('shiki/languages/shaderlab.tmLanguage.json').then((mod) => handleLang(mod.default, 'shaderlab')),
+	'shellscript': () => import('shiki/languages/shellscript.tmLanguage.json').then((mod) => handleLang(mod.default, 'shellscript')),
+	'smalltalk': () => import('shiki/languages/smalltalk.tmLanguage.json').then((mod) => handleLang(mod.default, 'smalltalk')),
+	'solidity': () => import('shiki/languages/solidity.tmLanguage.json').then((mod) => handleLang(mod.default, 'solidity')),
+	'sparql': () => import('shiki/languages/sparql.tmLanguage.json').then((mod) => handleLang(mod.default, 'sparql')),
+	'sql': () => import('shiki/languages/sql.tmLanguage.json').then((mod) => handleLang(mod.default, 'sql')),
+	'ssh-config': () => import('shiki/languages/ssh-config.tmLanguage.json').then((mod) => handleLang(mod.default, 'ssh-config')),
+	'stata': () => import('shiki/languages/stata.tmLanguage.json').then((mod) => handleLang(mod.default, 'stata')),
+	'stylus': () => import('shiki/languages/stylus.tmLanguage.json').then((mod) => handleLang(mod.default, 'stylus')),
+	'svelte': () => import('shiki/languages/svelte.tmLanguage.json').then((mod) => handleLang(mod.default, 'svelte')),
+	'swift': () => import('shiki/languages/swift.tmLanguage.json').then((mod) => handleLang(mod.default, 'swift')),
+	'system-verilog': () => import('shiki/languages/system-verilog.tmLanguage.json').then((mod) => handleLang(mod.default, 'system-verilog')),
+	'tasl': () => import('shiki/languages/tasl.tmLanguage.json').then((mod) => handleLang(mod.default, 'tasl')),
+	'tcl': () => import('shiki/languages/tcl.tmLanguage.json').then((mod) => handleLang(mod.default, 'tcl')),
+	'tex': () => import('shiki/languages/tex.tmLanguage.json').then((mod) => handleLang(mod.default, 'tex')),
+	'toml': () => import('shiki/languages/toml.tmLanguage.json').then((mod) => handleLang(mod.default, 'toml')),
+	'tsx': () => import('shiki/languages/tsx.tmLanguage.json').then((mod) => handleLang(mod.default, 'tsx')),
+	'turtle': () => import('shiki/languages/turtle.tmLanguage.json').then((mod) => handleLang(mod.default, 'turtle')),
+	'twig': () => import('shiki/languages/twig.tmLanguage.json').then((mod) => handleLang(mod.default, 'twig')),
+	'typescript': () => import('shiki/languages/typescript.tmLanguage.json').then((mod) => handleLang(mod.default, 'typescript')),
+	'v': () => import('shiki/languages/v.tmLanguage.json').then((mod) => handleLang(mod.default, 'v')),
+	'vb': () => import('shiki/languages/vb.tmLanguage.json').then((mod) => handleLang(mod.default, 'vb')),
+	'verilog': () => import('shiki/languages/verilog.tmLanguage.json').then((mod) => handleLang(mod.default, 'verilog')),
+	'vhdl': () => import('shiki/languages/vhdl.tmLanguage.json').then((mod) => handleLang(mod.default, 'vhdl')),
+	'viml': () => import('shiki/languages/viml.tmLanguage.json').then((mod) => handleLang(mod.default, 'viml')),
+	'vue-html': () => import('shiki/languages/vue-html.tmLanguage.json').then((mod) => handleLang(mod.default, 'vue-html')),
+	'vue': () => import('shiki/languages/vue.tmLanguage.json').then((mod) => handleLang(mod.default, 'vue')),
+	'wasm': () => import('shiki/languages/wasm.tmLanguage.json').then((mod) => handleLang(mod.default, 'wasm')),
+	'wenyan': () => import('shiki/languages/wenyan.tmLanguage.json').then((mod) => handleLang(mod.default, 'wenyan')),
+	'wgsl': () => import('shiki/languages/wgsl.tmLanguage.json').then((mod) => handleLang(mod.default, 'wgsl')),
+	'xml': () => import('shiki/languages/xml.tmLanguage.json').then((mod) => handleLang(mod.default, 'xml')),
+	'xsl': () => import('shiki/languages/xsl.tmLanguage.json').then((mod) => handleLang(mod.default, 'xsl')),
+	'yaml': () => import('shiki/languages/yaml.tmLanguage.json').then((mod) => handleLang(mod.default, 'yaml')),
+	'zenscript': () => import('shiki/languages/zenscript.tmLanguage.json').then((mod) => handleLang(mod.default, 'zenscript')),
 };
diff --git a/packages/astro/components/shiki-themes.js b/packages/astro/components/shiki-themes.js
index 68c36f4cd..7f07d2417 100644
--- a/packages/astro/components/shiki-themes.js
+++ b/packages/astro/components/shiki-themes.js
@@ -1,33 +1,43 @@
+/**
+ * This file is prebuilt from packages/astro/scripts/shiki-gen-themes.mjs
+ * Do not edit this directly, but instead edit that file and rerun it to generate this file.
+ */
+
+// prettier-ignore
 export const themes = {
-	'css-variables': () => import('shiki/themes/css-variables.json').then((mod) => mod.default),
-	'dark-plus': () => import('shiki/themes/dark-plus.json').then((mod) => mod.default),
-	'dracula-soft': () => import('shiki/themes/dracula-soft.json').then((mod) => mod.default),
-	dracula: () => import('shiki/themes/dracula.json').then((mod) => mod.default),
-	'github-dark-dimmed': () =>
-		import('shiki/themes/github-dark-dimmed.json').then((mod) => mod.default),
-	'github-dark': () => import('shiki/themes/github-dark.json').then((mod) => mod.default),
-	'github-light': () => import('shiki/themes/github-light.json').then((mod) => mod.default),
-	hc_light: () => import('shiki/themes/hc_light.json').then((mod) => mod.default),
-	'light-plus': () => import('shiki/themes/light-plus.json').then((mod) => mod.default),
-	'material-darker': () => import('shiki/themes/material-darker.json').then((mod) => mod.default),
-	'material-default': () => import('shiki/themes/material-default.json').then((mod) => mod.default),
-	'material-lighter': () => import('shiki/themes/material-lighter.json').then((mod) => mod.default),
-	'material-ocean': () => import('shiki/themes/material-ocean.json').then((mod) => mod.default),
-	'material-palenight': () =>
-		import('shiki/themes/material-palenight.json').then((mod) => mod.default),
-	'min-dark': () => import('shiki/themes/min-dark.json').then((mod) => mod.default),
-	'min-light': () => import('shiki/themes/min-light.json').then((mod) => mod.default),
-	monokai: () => import('shiki/themes/monokai.json').then((mod) => mod.default),
-	nord: () => import('shiki/themes/nord.json').then((mod) => mod.default),
-	'one-dark-pro': () => import('shiki/themes/one-dark-pro.json').then((mod) => mod.default),
-	poimandres: () => import('shiki/themes/poimandres.json').then((mod) => mod.default),
-	'rose-pine-dawn': () => import('shiki/themes/rose-pine-dawn.json').then((mod) => mod.default),
-	'rose-pine-moon': () => import('shiki/themes/rose-pine-moon.json').then((mod) => mod.default),
-	'rose-pine': () => import('shiki/themes/rose-pine.json').then((mod) => mod.default),
-	'slack-dark': () => import('shiki/themes/slack-dark.json').then((mod) => mod.default),
-	'slack-ochin': () => import('shiki/themes/slack-ochin.json').then((mod) => mod.default),
-	'solarized-dark': () => import('shiki/themes/solarized-dark.json').then((mod) => mod.default),
-	'solarized-light': () => import('shiki/themes/solarized-light.json').then((mod) => mod.default),
-	'vitesse-dark': () => import('shiki/themes/vitesse-dark.json').then((mod) => mod.default),
-	'vitesse-light': () => import('shiki/themes/vitesse-light.json').then((mod) => mod.default),
+	'css-variables': () => import('shiki/themes/css-variables.json').then(mod => mod.default),
+	'dark-plus': () => import('shiki/themes/dark-plus.json').then(mod => mod.default),
+	'dracula-soft': () => import('shiki/themes/dracula-soft.json').then(mod => mod.default),
+	'dracula': () => import('shiki/themes/dracula.json').then(mod => mod.default),
+	'github-dark-dimmed': () => import('shiki/themes/github-dark-dimmed.json').then(mod => mod.default),
+	'github-dark': () => import('shiki/themes/github-dark.json').then(mod => mod.default),
+	'github-light': () => import('shiki/themes/github-light.json').then(mod => mod.default),
+	'hc_light': () => import('shiki/themes/hc_light.json').then(mod => mod.default),
+	'light-plus': () => import('shiki/themes/light-plus.json').then(mod => mod.default),
+	'material-theme-darker': () => import('shiki/themes/material-theme-darker.json').then(mod => mod.default),
+	'material-theme-lighter': () => import('shiki/themes/material-theme-lighter.json').then(mod => mod.default),
+	'material-theme-ocean': () => import('shiki/themes/material-theme-ocean.json').then(mod => mod.default),
+	'material-theme-palenight': () => import('shiki/themes/material-theme-palenight.json').then(mod => mod.default),
+	'material-theme': () => import('shiki/themes/material-theme.json').then(mod => mod.default),
+	'min-dark': () => import('shiki/themes/min-dark.json').then(mod => mod.default),
+	'min-light': () => import('shiki/themes/min-light.json').then(mod => mod.default),
+	'monokai': () => import('shiki/themes/monokai.json').then(mod => mod.default),
+	'nord': () => import('shiki/themes/nord.json').then(mod => mod.default),
+	'one-dark-pro': () => import('shiki/themes/one-dark-pro.json').then(mod => mod.default),
+	'poimandres': () => import('shiki/themes/poimandres.json').then(mod => mod.default),
+	'rose-pine-dawn': () => import('shiki/themes/rose-pine-dawn.json').then(mod => mod.default),
+	'rose-pine-moon': () => import('shiki/themes/rose-pine-moon.json').then(mod => mod.default),
+	'rose-pine': () => import('shiki/themes/rose-pine.json').then(mod => mod.default),
+	'slack-dark': () => import('shiki/themes/slack-dark.json').then(mod => mod.default),
+	'slack-ochin': () => import('shiki/themes/slack-ochin.json').then(mod => mod.default),
+	'solarized-dark': () => import('shiki/themes/solarized-dark.json').then(mod => mod.default),
+	'solarized-light': () => import('shiki/themes/solarized-light.json').then(mod => mod.default),
+	'vitesse-dark': () => import('shiki/themes/vitesse-dark.json').then(mod => mod.default),
+	'vitesse-light': () => import('shiki/themes/vitesse-light.json').then(mod => mod.default),
+	// old theme names for compat
+	'material-darker': () => import('shiki/themes/material-theme-darker').then(mod => mod.default),
+	'material-default': () => import('shiki/themes/material-theme').then(mod => mod.default),
+	'material-lighter': () => import('shiki/themes/material-theme-lighter').then(mod => mod.default),
+	'material-ocean': () => import('shiki/themes/material-theme-ocean').then(mod => mod.default),
+	'material-palenight': () => import('shiki/themes/material-theme-palenight').then(mod => mod.default),
 };
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 0c1cc0e32..08ee274a6 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
 {
   "name": "astro",
-  "version": "2.3.2",
+  "version": "2.3.4",
   "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.",
   "type": "module",
   "author": "withastro",
@@ -64,6 +64,10 @@
     "./zod": {
       "types": "./zod.d.ts",
       "default": "./zod.mjs"
+    },
+    "./middleware": {
+      "types": "./dist/core/middleware/index.d.ts",
+      "default": "./dist/core/middleware/index.js"
     }
   },
   "imports": {
@@ -106,11 +110,11 @@
     "test:e2e:match": "playwright test -g"
   },
   "dependencies": {
-    "@astrojs/compiler": "^1.3.1",
-    "@astrojs/language-server": "^0.28.3",
+    "@astrojs/compiler": "^1.4.0",
+    "@astrojs/language-server": "^1.0.0",
     "@astrojs/markdown-remark": "^2.1.4",
-    "@astrojs/telemetry": "^2.1.0",
-    "@astrojs/webapi": "^2.1.0",
+    "@astrojs/telemetry": "^2.1.1",
+    "@astrojs/webapi": "^2.1.1",
     "@babel/core": "^7.18.2",
     "@babel/generator": "^7.18.2",
     "@babel/parser": "^7.18.4",
@@ -119,7 +123,7 @@
     "@babel/types": "^7.18.4",
     "@types/babel__core": "^7.1.19",
     "@types/yargs-parser": "^21.0.0",
-    "acorn": "^8.8.1",
+    "acorn": "^8.8.2",
     "boxen": "^6.2.1",
     "chokidar": "^3.5.3",
     "ci-info": "^3.3.1",
@@ -130,7 +134,7 @@
     "devalue": "^4.2.0",
     "diff": "^5.1.0",
     "es-module-lexer": "^1.1.0",
-    "estree-walker": "^3.0.1",
+    "estree-walker": "3.0.0",
     "execa": "^6.1.0",
     "fast-glob": "^3.2.11",
     "github-slugger": "^2.0.0",
@@ -146,7 +150,7 @@
     "rehype": "^12.0.1",
     "semver": "^7.3.8",
     "server-destroy": "^1.0.1",
-    "shiki": "^0.11.1",
+    "shiki": "^0.14.1",
     "slash": "^4.0.0",
     "string-width": "^5.1.2",
     "strip-ansi": "^7.0.1",
@@ -181,7 +185,6 @@
     "@types/rimraf": "^3.0.2",
     "@types/send": "^0.17.1",
     "@types/server-destroy": "^1.0.1",
-    "@types/sharp": "^0.31.1",
     "@types/unist": "^2.0.6",
     "astro-scripts": "workspace:*",
     "chai": "^4.3.6",
@@ -196,13 +199,13 @@
     "remark-code-titles": "^0.1.2",
     "rollup": "^3.9.0",
     "sass": "^1.52.2",
-    "sharp": "^0.31.3",
+    "sharp": "^0.32.1",
     "srcset-parse": "^1.1.0",
     "undici": "^5.22.0",
     "unified": "^10.1.2"
   },
   "peerDependencies": {
-    "sharp": "^0.31.3"
+    "sharp": ">=0.31.0"
   },
   "peerDependenciesMeta": {
     "sharp": {
diff --git a/packages/astro/scripts/shiki-gen-languages.mjs b/packages/astro/scripts/shiki-gen-languages.mjs
index 9a497f6e9..29cdca413 100644
--- a/packages/astro/scripts/shiki-gen-languages.mjs
+++ b/packages/astro/scripts/shiki-gen-languages.mjs
@@ -4,31 +4,34 @@ const dir = await fs.promises.readdir('packages/astro/node_modules/shiki/languag
 
 const langImports = dir.map((f) => {
 	const key = f.slice(0, f.indexOf('.tmLanguage.json'));
-	return [
-		key,
-		`import('shiki/languages/${f}').then(mod => mod.default).then(grammar => {
-	const lang = BUNDLED_LANGUAGES.find(l => l.id === '${key}');
-	if(lang) {
+	return [key, `import('shiki/languages/${f}').then((mod) => handleLang(mod.default, '${key}'))`];
+});
+
+let code = `\
+/**
+ * This file is prebuilt from packages/astro/scripts/shiki-gen-languages.mjs
+ * Do not edit this directly, but instead edit that file and rerun it to generate this file.
+ */
+
+import { BUNDLED_LANGUAGES } from 'shiki';
+
+function handleLang(grammar, language) {
+	const lang = BUNDLED_LANGUAGES.find((l) => l.id === language);
+	if (lang) {
 		return {
 			...lang,
-			grammar
+			grammar,
 		};
 	} else {
 		return undefined;
 	}
-})`,
-	];
-});
-let code = `import { BUNDLED_LANGUAGES } from 'shiki';
+}
 
+// prettier-ignore
 export const languages = {`;
-let i = 0;
+
 for (const [key, imp] of langImports) {
-	if (i > 0) {
-		code += ',';
-	}
-	code += `\n\t'${key}': () => ${imp}`;
-	i++;
+	code += `\n\t'${key}': () => ${imp},`;
 }
 code += '\n};';
 
diff --git a/packages/astro/scripts/shiki-gen-themes.mjs b/packages/astro/scripts/shiki-gen-themes.mjs
index 756be8349..4d400c850 100644
--- a/packages/astro/scripts/shiki-gen-themes.mjs
+++ b/packages/astro/scripts/shiki-gen-themes.mjs
@@ -2,18 +2,36 @@ import fs from 'fs';
 
 const dir = await fs.promises.readdir('packages/astro/node_modules/shiki/themes/');
 
+const toThemeImport = (theme) => `import('shiki/themes/${theme}').then(mod => mod.default)`;
+
 const themeImports = dir.map((f) => {
-	return [f.slice(0, f.indexOf('.json')), `import('shiki/themes/${f}').then(mod => mod.default)`];
+	return [f.slice(0, f.indexOf('.json')), toThemeImport(f)];
 });
 
-let code = `export const themes = {`;
-let i = 0;
+// Map of old theme names to new names to preserve compatibility when we upgrade shiki
+const compatThemes = {
+	'material-darker': 'material-theme-darker',
+	'material-default': 'material-theme',
+	'material-lighter': 'material-theme-lighter',
+	'material-ocean': 'material-theme-ocean',
+	'material-palenight': 'material-theme-palenight',
+};
+
+let code = `\
+/**
+ * This file is prebuilt from packages/astro/scripts/shiki-gen-themes.mjs
+ * Do not edit this directly, but instead edit that file and rerun it to generate this file.
+ */
+
+// prettier-ignore
+export const themes = {`;
+
 for (const [key, imp] of themeImports) {
-	if (i > 0) {
-		code += ',';
-	}
-	code += `\n\t'${key}': () => ${imp}`;
-	i++;
+	code += `\n\t'${key}': () => ${imp},`;
+}
+code += `\n\t// old theme names for compat`;
+for (const oldName in compatThemes) {
+	code += `\n\t'${oldName}': () => ${toThemeImport(compatThemes[oldName])},`;
 }
 code += '\n};';
 
diff --git a/packages/astro/src/@types/app.d.ts b/packages/astro/src/@types/app.d.ts
new file mode 100644
index 000000000..1c0908bb8
--- /dev/null
+++ b/packages/astro/src/@types/app.d.ts
@@ -0,0 +1,9 @@
+/**
+ * Shared interfaces throughout the application that can be overridden by the user.
+ */
+declare namespace App {
+	/**
+	 * Used by middlewares to store information, that can be read by the user via the global `Astro.locals`
+	 */
+	interface Locals {}
+}
diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts
index 7ec333613..f3738d53c 100644
--- a/packages/astro/src/@types/astro.ts
+++ b/packages/astro/src/@types/astro.ts
@@ -103,6 +103,7 @@ export interface CLIFlags {
 	drafts?: boolean;
 	open?: boolean;
 	experimentalAssets?: boolean;
+	experimentalMiddleware?: boolean;
 }
 
 export interface BuildConfig {
@@ -511,6 +512,23 @@ export interface AstroUserConfig {
 	 */
 	trailingSlash?: 'always' | 'never' | 'ignore';
 
+	/**
+	 * @docs
+	 * @name scopedStyleStrategy
+	 * @type {('where' | 'class')}
+	 * @default `'where'`
+	 * @description
+	 * @version 2.4
+	 *
+	 * Specify the strategy used for scoping styles within Astro components. Choose from:
+	 *   - `'where'` - Use `:where` selectors, causing no specifity increase.
+	 *   - `'class'` - Use class-based selectors, causing a +1 specifity increase.
+	 *
+	 * Using `'class'` is helpful when you want to ensure that element selectors within an Astro component override global style defaults (e.g. from a global stylesheet).
+	 * Using `'where'` gives you more control over specifity, but requires that you use higher-specifity selectors, layers, and other tools to control which selectors are applied.
+	 */
+	scopedStyleStrategy?: 'where' | 'class';
+
 	/**
 	 * @docs
 	 * @name adapter
@@ -1034,6 +1052,46 @@ export interface AstroUserConfig {
 		 * }
 		 */
 		assets?: boolean;
+
+		/**
+		 * @docs
+		 * @name experimental.inlineStylesheets
+		 * @type {('always' | 'auto' | 'never')}
+		 * @default `never`
+		 * @description
+		 * Control whether styles are sent to the browser in a separate css file or inlined into 
+

\ No newline at end of file diff --git a/packages/astro/test/fixtures/content/src/components/LayoutProp.astro b/packages/astro/test/fixtures/content/src/components/LayoutProp.astro index df7493c3e..a2954162a 100644 --- a/packages/astro/test/fixtures/content/src/components/LayoutProp.astro +++ b/packages/astro/test/fixtures/content/src/components/LayoutProp.astro @@ -1,6 +1,6 @@ --- import { CollectionEntry, getCollection } from 'astro:content'; - +import H3 from './H3.astro' // Test for recursive `getCollection()` calls const blog = await getCollection('blog'); @@ -23,6 +23,7 @@ const {

{title}

+

H3 inserted in the layout