diff --git a/.changeset/three-onions-repeat.md b/.changeset/three-onions-repeat.md
new file mode 100644
index 000000000..1781defcc
--- /dev/null
+++ b/.changeset/three-onions-repeat.md
@@ -0,0 +1,5 @@
+---
+'astro': major
+---
+
+The `astro check` command now requires an external package `@astrojs/check` and an install of `typescript` in your project. This was done in order to make the main `astro` package smaller and give more flexibility to users in regard to the version of TypeScript they use.
diff --git a/packages/astro/package.json b/packages/astro/package.json
index d8c5e9877..36b5ac1c7 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -117,7 +117,6 @@
   "dependencies": {
     "@astrojs/compiler": "^1.6.3",
     "@astrojs/internal-helpers": "workspace:*",
-    "@astrojs/language-server": "^1.0.0",
     "@astrojs/markdown-remark": "workspace:*",
     "@astrojs/telemetry": "workspace:*",
     "@babel/core": "^7.22.5",
@@ -165,7 +164,6 @@
     "string-width": "^5.1.2",
     "strip-ansi": "^7.1.0",
     "tsconfig-resolver": "^3.0.1",
-    "typescript": "*",
     "unist-util-visit": "^4.1.2",
     "vfile": "^5.3.7",
     "vite": "^4.4.6",
@@ -197,6 +195,7 @@
     "@types/send": "^0.17.1",
     "@types/server-destroy": "^1.0.1",
     "@types/unist": "^2.0.6",
+    "@astrojs/check": "^0.1.0",
     "astro-scripts": "workspace:*",
     "chai": "^4.3.7",
     "cheerio": "1.0.0-rc.12",
diff --git a/packages/astro/src/cli/check/index.ts b/packages/astro/src/cli/check/index.ts
index 96bee308d..5ad031714 100644
--- a/packages/astro/src/cli/check/index.ts
+++ b/packages/astro/src/cli/check/index.ts
@@ -1,396 +1,33 @@
-import {
-	AstroCheck,
-	DiagnosticSeverity,
-	type GetDiagnosticsResult,
-} from '@astrojs/language-server';
-import type { FSWatcher } from 'chokidar';
-import glob from 'fast-glob';
-import { bold, dim, red, yellow } from 'kleur/colors';
-import { createRequire } from 'module';
-import fs from 'node:fs';
-import { join } from 'node:path';
-import { fileURLToPath, pathToFileURL } from 'node:url';
-import ora from 'ora';
-import type { Arguments as Flags } from 'yargs-parser';
-import type { AstroSettings } from '../../@types/astro';
-import { resolveConfig } from '../../core/config/config.js';
-import { createNodeLogging } from '../../core/config/logging.js';
-import { createSettings } from '../../core/config/settings.js';
-import type { LogOptions } from '../../core/logger/core.js';
-import { debug, info } from '../../core/logger/core.js';
-import { printHelp } from '../../core/messages.js';
-import type { syncInternal } from '../../core/sync';
-import { eventCliSession, telemetry } from '../../events/index.js';
-import { runHookConfigSetup } from '../../integrations/index.js';
-import { flagsToAstroInlineConfig } from '../flags.js';
-import { printDiagnostic } from './print.js';
+import path from 'node:path';
+import type { Arguments } from 'yargs-parser';
+import { error, info } from '../../core/logger/core.js';
+import { createLoggingFromFlags } from '../flags.js';
+import { getPackage } from '../install-package.js';
 
-type DiagnosticResult = {
-	errors: number;
-	warnings: number;
-	hints: number;
-};
+export async function check(flags: Arguments) {
+	const logging = createLoggingFromFlags(flags);
+	const getPackageOpts = { skipAsk: flags.yes || flags.y, cwd: flags.root };
+	const checkPackage = await getPackage<typeof import('@astrojs/check')>(
+		'@astrojs/check',
+		logging,
+		getPackageOpts,
+		['typescript']
+	);
+	const typescript = await getPackage('typescript', logging, getPackageOpts);
 
-export type CheckPayload = {
-	/**
-	 * Flags passed via CLI
-	 */
-	flags: Flags;
-};
-
-type CheckFlags = {
-	/**
-	 * Whether the `check` command should watch for `.astro` and report errors
-	 * @default {false}
-	 */
-	watch: boolean;
-};
-
-/**
- *
- * Types of response emitted by the checker
- */
-export enum CheckResult {
-	/**
-	 * Operation finished without errors
-	 */
-	ExitWithSuccess,
-	/**
-	 * Operation finished with errors
-	 */
-	ExitWithError,
-	/**
-	 * The consumer should not terminate the operation
-	 */
-	Listen,
-}
-
-const ASTRO_GLOB_PATTERN = '**/*.astro';
-
-/**
- * Checks `.astro` files for possible errors.
- *
- * If the `--watch` flag is provided, the command runs indefinitely and provides diagnostics
- * when `.astro` files are modified.
- *
- * Every time an astro files is modified, content collections are also generated.
- *
- * @param {CheckPayload} options Options passed {@link AstroChecker}
- * @param {Flags} options.flags Flags coming from the CLI
- */
-export async function check({ flags }: CheckPayload): Promise<AstroChecker | undefined> {
-	if (flags.help || flags.h) {
-		printHelp({
-			commandName: 'astro check',
-			usage: '[...flags]',
-			tables: {
-				Flags: [
-					['--watch', 'Watch Astro files for changes and re-run checks.'],
-					['--help (-h)', 'See all available flags.'],
-				],
-			},
-			description: `Runs diagnostics against your project and reports errors to the console.`,
-		});
+	if (!checkPackage || !typescript) {
+		error(
+			logging,
+			'check',
+			'The `@astrojs/check` and `typescript` packages are required for this command to work. Please manually install them into your project and try again.'
+		);
 		return;
 	}
 
-	// Load settings
-	const inlineConfig = flagsToAstroInlineConfig(flags);
-	const logging = createNodeLogging(inlineConfig);
-	const { userConfig, astroConfig } = await resolveConfig(inlineConfig, 'check');
-	telemetry.record(eventCliSession('check', userConfig, flags));
-	const settings = createSettings(astroConfig, fileURLToPath(astroConfig.root));
+	const { check: checker, parseArgsAsCheckConfig } = checkPackage;
 
-	const checkFlags = parseFlags(flags);
-	if (checkFlags.watch) {
-		info(logging, 'check', 'Checking files in watch mode');
-	} else {
-		info(logging, 'check', 'Checking files');
-	}
+	const config = parseArgsAsCheckConfig(process.argv);
 
-	const { syncInternal } = await import('../../core/sync/index.js');
-	const root = settings.config.root;
-	const require = createRequire(import.meta.url);
-	const diagnosticChecker = new AstroCheck(
-		root.toString(),
-		require.resolve('typescript/lib/tsserverlibrary.js', {
-			paths: [root.toString()],
-		})
-	);
-
-	return new AstroChecker({
-		syncInternal,
-		settings,
-		fileSystem: fs,
-		logging,
-		diagnosticChecker,
-		isWatchMode: checkFlags.watch,
-	});
-}
-
-type CheckerConstructor = {
-	diagnosticChecker: AstroCheck;
-
-	isWatchMode: boolean;
-
-	syncInternal: typeof syncInternal;
-
-	settings: Readonly<AstroSettings>;
-
-	logging: Readonly<LogOptions>;
-
-	fileSystem: typeof fs;
-};
-
-/**
- * Responsible to check files - classic or watch mode - and report diagnostics.
- *
- * When in watch mode, the class does a whole check pass, and then starts watching files.
- * When a change occurs to an `.astro` file, the checker builds content collections again and lint all the `.astro` files.
- */
-export class AstroChecker {
-	readonly #diagnosticsChecker: AstroCheck;
-	readonly #shouldWatch: boolean;
-	readonly #syncInternal: CheckerConstructor['syncInternal'];
-
-	readonly #settings: AstroSettings;
-
-	readonly #logging: LogOptions;
-	readonly #fs: typeof fs;
-	#watcher?: FSWatcher;
-
-	#filesCount: number;
-	#updateDiagnostics: NodeJS.Timeout | undefined;
-
-	constructor({
-		diagnosticChecker,
-		isWatchMode,
-		syncInternal,
-		settings,
-		fileSystem,
-		logging,
-	}: CheckerConstructor) {
-		this.#diagnosticsChecker = diagnosticChecker;
-		this.#shouldWatch = isWatchMode;
-		this.#syncInternal = syncInternal;
-		this.#logging = logging;
-		this.#settings = settings;
-		this.#fs = fileSystem;
-		this.#filesCount = 0;
-	}
-
-	/**
-	 * Check all `.astro` files once and then finishes the operation.
-	 */
-	public async check(): Promise<CheckResult> {
-		return await this.#checkAllFiles(true);
-	}
-
-	/**
-	 * Check all `.astro` files and then start watching for changes.
-	 */
-	public async watch(): Promise<CheckResult> {
-		await this.#checkAllFiles(true);
-		await this.#watch();
-		return CheckResult.Listen;
-	}
-
-	/**
-	 * Stops the watch. It terminates the inner server.
-	 */
-	public async stop() {
-		await this.#watcher?.close();
-	}
-
-	/**
-	 * Whether the checker should run in watch mode
-	 */
-	public get isWatchMode(): boolean {
-		return this.#shouldWatch;
-	}
-
-	async #openDocuments() {
-		this.#filesCount = await openAllDocuments(
-			this.#settings.config.root,
-			[],
-			this.#diagnosticsChecker
-		);
-	}
-
-	/**
-	 * Lint all `.astro` files, and report the result in console. Operations executed, in order:
-	 * 1. Compile content collections.
-	 * 2. Optionally, traverse the file system for `.astro` files and saves their paths.
-	 * 3. Get diagnostics for said files and print the result in console.
-	 *
-	 * @param openDocuments Whether the operation should open all `.astro` files
-	 */
-	async #checkAllFiles(openDocuments: boolean): Promise<CheckResult> {
-		// Run `astro:config:setup` before syncing to initialize integrations.
-		// We do this manually as we're calling `syncInternal` directly.
-		const syncSettings = await runHookConfigSetup({
-			settings: this.#settings,
-			logging: this.#logging,
-			command: 'build',
-		});
-		const processExit = await this.#syncInternal(syncSettings, {
-			logging: this.#logging,
-			fs: this.#fs,
-		});
-		// early exit on sync failure
-		if (processExit === 1) return processExit;
-
-		let spinner = ora(
-			` Getting diagnostics for Astro files in ${fileURLToPath(this.#settings.config.root)}…`
-		).start();
-
-		if (openDocuments) {
-			await this.#openDocuments();
-		}
-
-		let diagnostics = await this.#diagnosticsChecker.getDiagnostics();
-
-		spinner.succeed();
-
-		let brokenDownDiagnostics = this.#breakDownDiagnostics(diagnostics);
-		this.#logDiagnosticsSeverity(brokenDownDiagnostics);
-		return brokenDownDiagnostics.errors > 0
-			? CheckResult.ExitWithError
-			: CheckResult.ExitWithSuccess;
-	}
-
-	#checkForDiagnostics() {
-		clearTimeout(this.#updateDiagnostics);
-		// @ematipico: I am not sure of `setTimeout`. I would rather use a debounce but let's see if this works.
-		// Inspiration from `svelte-check`.
-		this.#updateDiagnostics = setTimeout(async () => await this.#checkAllFiles(false), 500);
-	}
-
-	/**
-	 * This function is responsible to attach events to the server watcher
-	 */
-	async #watch() {
-		const { default: chokidar } = await import('chokidar');
-		this.#watcher = chokidar.watch(
-			join(fileURLToPath(this.#settings.config.root), ASTRO_GLOB_PATTERN),
-			{
-				ignored: ['**/node_modules/**'],
-				ignoreInitial: true,
-			}
-		);
-
-		this.#watcher.on('add', (file) => {
-			this.#addDocument(file);
-			this.#filesCount += 1;
-			this.#checkForDiagnostics();
-		});
-		this.#watcher.on('change', (file) => {
-			this.#addDocument(file);
-			this.#checkForDiagnostics();
-		});
-		this.#watcher.on('unlink', (file) => {
-			this.#diagnosticsChecker.removeDocument(file);
-			this.#filesCount -= 1;
-			this.#checkForDiagnostics();
-		});
-	}
-
-	/**
-	 * Add a document to the diagnostics checker
-	 * @param filePath Path to the file
-	 */
-	#addDocument(filePath: string) {
-		const text = fs.readFileSync(filePath, 'utf-8');
-		this.#diagnosticsChecker.upsertDocument({
-			uri: pathToFileURL(filePath).toString(),
-			text,
-		});
-	}
-
-	/**
-	 * Logs the result of the various diagnostics
-	 *
-	 * @param result Result emitted by AstroChecker.#breakDownDiagnostics
-	 */
-	#logDiagnosticsSeverity(result: Readonly<DiagnosticResult>) {
-		info(
-			this.#logging,
-			'diagnostics',
-			[
-				bold(`Result (${this.#filesCount} file${this.#filesCount === 1 ? '' : 's'}): `),
-				bold(red(`${result.errors} ${result.errors === 1 ? 'error' : 'errors'}`)),
-				bold(yellow(`${result.warnings} ${result.warnings === 1 ? 'warning' : 'warnings'}`)),
-				dim(`${result.hints} ${result.hints === 1 ? 'hint' : 'hints'}\n`),
-			].join(`\n${dim('-')} `)
-		);
-	}
-
-	/**
-	 * It loops through all diagnostics and break down diagnostics that are errors, warnings or hints.
-	 */
-	#breakDownDiagnostics(diagnostics: Readonly<GetDiagnosticsResult[]>): DiagnosticResult {
-		let result: DiagnosticResult = {
-			errors: 0,
-			warnings: 0,
-			hints: 0,
-		};
-
-		diagnostics.forEach((diag) => {
-			diag.diagnostics.forEach((d) => {
-				info(this.#logging, 'diagnostics', `\n ${printDiagnostic(diag.fileUri, diag.text, d)}`);
-
-				switch (d.severity) {
-					case DiagnosticSeverity.Error: {
-						result.errors++;
-						break;
-					}
-					case DiagnosticSeverity.Warning: {
-						result.warnings++;
-						break;
-					}
-					case DiagnosticSeverity.Hint: {
-						result.hints++;
-						break;
-					}
-				}
-			});
-		});
-
-		return result;
-	}
-}
-
-/**
- * Open all Astro files in the given directory and return the number of files found.
- */
-async function openAllDocuments(
-	workspaceUri: URL,
-	filePathsToIgnore: string[],
-	checker: AstroCheck
-): Promise<number> {
-	const files = await glob(ASTRO_GLOB_PATTERN, {
-		cwd: fileURLToPath(workspaceUri),
-		ignore: ['node_modules/**'].concat(filePathsToIgnore.map((ignore) => `${ignore}/**`)),
-		absolute: true,
-	});
-
-	for (const file of files) {
-		debug('check', `Adding file ${file} to the list of files to check.`);
-		const text = fs.readFileSync(file, 'utf-8');
-		checker.upsertDocument({
-			uri: pathToFileURL(file).toString(),
-			text,
-		});
-	}
-
-	return files.length;
-}
-
-/**
- * Parse flags and sets defaults
- */
-function parseFlags(flags: Flags): CheckFlags {
-	return {
-		watch: flags.watch ?? false,
-	};
+	info(logging, 'check', `Getting diagnostics for Astro files in ${path.resolve(config.root)}...`);
+	return await checker(config);
 }
diff --git a/packages/astro/src/cli/check/print.ts b/packages/astro/src/cli/check/print.ts
deleted file mode 100644
index bd8de2ddb..000000000
--- a/packages/astro/src/cli/check/print.ts
+++ /dev/null
@@ -1,119 +0,0 @@
-import { DiagnosticSeverity, offsetAt, type Diagnostic } from '@astrojs/language-server';
-import {
-	bgRed,
-	bgWhite,
-	bgYellow,
-	black,
-	bold,
-	cyan,
-	gray,
-	red,
-	white,
-	yellow,
-} from 'kleur/colors';
-import { fileURLToPath } from 'node:url';
-import stringWidth from 'string-width';
-
-export function printDiagnostic(filePath: string, text: string, diag: Diagnostic): string {
-	let result = [];
-
-	// Lines and characters are 0-indexed, so we need to add 1 to the offset to get the actual line and character
-	const realStartLine = diag.range.start.line + 1;
-	const realStartCharacter = diag.range.start.character + 1;
-
-	// IDE friendly path that user can CTRL+Click to open the file at a specific line / character
-	const IDEFilePath = `${bold(cyan(fileURLToPath(filePath)))}:${bold(yellow(realStartLine))}:${bold(
-		yellow(realStartCharacter)
-	)}`;
-	result.push(
-		`${IDEFilePath} ${bold(getColorForSeverity(diag, getStringForSeverity(diag)))}: ${diag.message}`
-	);
-
-	// Optionally add the line before the error to add context if not empty
-	const previousLine = getLine(diag.range.start.line - 1, text);
-	if (previousLine) {
-		result.push(`${getPrintableLineNumber(realStartLine - 1)}  ${gray(previousLine)}`);
-	}
-
-	// Add the line with the error
-	const str = getLine(diag.range.start.line, text);
-	const lineNumStr = realStartLine.toString().padStart(2, '0');
-	const lineNumLen = lineNumStr.length;
-	result.push(`${getBackgroundForSeverity(diag, lineNumStr)}  ${str}`);
-
-	// Adds tildes under the specific range where the diagnostic is
-	const tildes = generateString('~', diag.range.end.character - diag.range.start.character);
-
-	// NOTE: This is not perfect, if the line include any characters that is made of multiple characters, for example
-	// regionals flags, but the terminal can't display it, then the number of spaces will be wrong. Not sure how to fix.
-	const beforeChars = stringWidth(str.substring(0, diag.range.start.character));
-	const spaces = generateString(' ', beforeChars + lineNumLen - 1);
-	result.push(`   ${spaces}${bold(getColorForSeverity(diag, tildes))}`);
-
-	const nextLine = getLine(diag.range.start.line + 1, text);
-	if (nextLine) {
-		result.push(`${getPrintableLineNumber(realStartLine + 1)}  ${gray(nextLine)}`);
-	}
-
-	// Force a new line at the end
-	result.push('');
-
-	return result.join('\n');
-}
-
-function generateString(str: string, len: number): string {
-	return Array.from({ length: len }, () => str).join('');
-}
-
-function getStringForSeverity(diag: Diagnostic): string {
-	switch (diag.severity) {
-		case DiagnosticSeverity.Error:
-			return 'Error';
-		case DiagnosticSeverity.Warning:
-			return 'Warning';
-		case DiagnosticSeverity.Hint:
-			return 'Hint';
-		default:
-			return 'Unknown';
-	}
-}
-
-function getColorForSeverity(diag: Diagnostic, text: string): string {
-	switch (diag.severity) {
-		case DiagnosticSeverity.Error:
-			return red(text);
-		case DiagnosticSeverity.Warning:
-			return yellow(text);
-		case DiagnosticSeverity.Hint:
-			return gray(text);
-		default:
-			return text;
-	}
-}
-
-function getBackgroundForSeverity(diag: Diagnostic, text: string): string {
-	switch (diag.severity) {
-		case DiagnosticSeverity.Error:
-			return bgRed(white(text));
-		case DiagnosticSeverity.Warning:
-			return bgYellow(white(text));
-		case DiagnosticSeverity.Hint:
-			return bgWhite(black(text));
-		default:
-			return text;
-	}
-}
-
-function getPrintableLineNumber(line: number): string {
-	return bgWhite(black(line.toString().padStart(2, '0')));
-}
-
-function getLine(line: number, text: string): string {
-	return text
-		.substring(
-			offsetAt({ line, character: 0 }, text),
-			offsetAt({ line, character: Number.MAX_SAFE_INTEGER }, text)
-		)
-		.replace(/\t/g, ' ')
-		.trimEnd();
-}
diff --git a/packages/astro/src/cli/index.ts b/packages/astro/src/cli/index.ts
index d16ea91e2..fdf43201f 100644
--- a/packages/astro/src/cli/index.ts
+++ b/packages/astro/src/cli/index.ts
@@ -154,18 +154,12 @@ async function runCommand(cmd: string, flags: yargs.Arguments) {
 		}
 		case 'check': {
 			const { check } = await import('./check/index.js');
-			// We create a server to start doing our operations
-			const checkServer = await check({ flags });
-			if (checkServer) {
-				if (checkServer.isWatchMode) {
-					await checkServer.watch();
-					return await new Promise(() => {}); // lives forever
-				} else {
-					const checkResult = await checkServer.check();
-					return process.exit(checkResult);
-				}
+			const checkServer = await check(flags);
+			if (flags.watch) {
+				return await new Promise(() => {}); // lives forever
+			} else {
+				return process.exit(checkServer ? 1 : 0);
 			}
-			return;
 		}
 		case 'sync': {
 			const { sync } = await import('./sync/index.js');
diff --git a/packages/astro/src/cli/install-package.ts b/packages/astro/src/cli/install-package.ts
new file mode 100644
index 000000000..8793d9985
--- /dev/null
+++ b/packages/astro/src/cli/install-package.ts
@@ -0,0 +1,124 @@
+import boxen from 'boxen';
+import { execa } from 'execa';
+import { bold, cyan, dim, magenta } from 'kleur/colors';
+import { createRequire } from 'node:module';
+import ora from 'ora';
+import prompts from 'prompts';
+import whichPm from 'which-pm';
+import { debug, info, type LogOptions } from '../core/logger/core.js';
+
+type GetPackageOptions = {
+	skipAsk?: boolean;
+	cwd?: string;
+};
+
+export async function getPackage<T>(
+	packageName: string,
+	logging: LogOptions,
+	options: GetPackageOptions,
+	otherDeps: string[] = []
+): Promise<T | undefined> {
+	const require = createRequire(options.cwd ?? process.cwd());
+
+	let packageImport;
+	try {
+		require.resolve(packageName);
+
+		// The `require.resolve` is required as to avoid Node caching the failed `import`
+		packageImport = await import(packageName);
+	} catch (e) {
+		info(
+			logging,
+			'',
+			`To continue, Astro requires the following dependency to be installed: ${bold(packageName)}.`
+		);
+		const result = await installPackage([packageName, ...otherDeps], options, logging);
+
+		if (result) {
+			packageImport = await import(packageName);
+		} else {
+			return undefined;
+		}
+	}
+
+	return packageImport as T;
+}
+
+function getInstallCommand(packages: string[], packageManager: string) {
+	switch (packageManager) {
+		case 'npm':
+			return { pm: 'npm', command: 'install', flags: [], dependencies: packages };
+		case 'yarn':
+			return { pm: 'yarn', command: 'add', flags: [], dependencies: packages };
+		case 'pnpm':
+			return { pm: 'pnpm', command: 'add', flags: [], dependencies: packages };
+		default:
+			return null;
+	}
+}
+
+async function installPackage(
+	packageNames: string[],
+	options: GetPackageOptions,
+	logging: LogOptions
+): Promise<boolean> {
+	const cwd = options.cwd ?? process.cwd();
+	const packageManager = (await whichPm(cwd)).name ?? 'npm';
+	const installCommand = getInstallCommand(packageNames, packageManager);
+
+	if (!installCommand) {
+		return false;
+	}
+
+	const coloredOutput = `${bold(installCommand.pm)} ${installCommand.command}${[
+		'',
+		...installCommand.flags,
+	].join(' ')} ${cyan(installCommand.dependencies.join(' '))}`;
+	const message = `\n${boxen(coloredOutput, {
+		margin: 0.5,
+		padding: 0.5,
+		borderStyle: 'round',
+	})}\n`;
+	info(
+		logging,
+		null,
+		`\n  ${magenta('Astro will run the following command:')}\n  ${dim(
+			'If you skip this step, you can always run it yourself later'
+		)}\n${message}`
+	);
+
+	let response;
+	if (options.skipAsk) {
+		response = true;
+	} else {
+		response = (
+			await prompts({
+				type: 'confirm',
+				name: 'askToContinue',
+				message: 'Continue?',
+				initial: true,
+			})
+		).askToContinue;
+	}
+
+	if (Boolean(response)) {
+		const spinner = ora('Installing dependencies...').start();
+		try {
+			await execa(
+				installCommand.pm,
+				[installCommand.command, ...installCommand.flags, ...installCommand.dependencies],
+				{ cwd: cwd }
+			);
+			spinner.succeed();
+
+			return true;
+		} catch (err) {
+			debug('add', 'Error installing dependencies', err);
+			spinner.fail();
+
+			return false;
+		}
+	} else {
+		return false;
+	}
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 48bce10ca..f32ce7081 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -485,9 +485,6 @@ importers:
       '@astrojs/internal-helpers':
         specifier: workspace:*
         version: link:../internal-helpers
-      '@astrojs/language-server':
-        specifier: ^1.0.0
-        version: 1.0.0
       '@astrojs/markdown-remark':
         specifier: workspace:*
         version: link:../markdown/remark
@@ -589,7 +586,7 @@ importers:
         version: 3.0.0
       network-information-types:
         specifier: ^0.1.1
-        version: 0.1.1(typescript@5.0.2)
+        version: 0.1.1(typescript@5.1.6)
       ora:
         specifier: ^6.3.1
         version: 6.3.1
@@ -629,9 +626,6 @@ importers:
       tsconfig-resolver:
         specifier: ^3.0.1
         version: 3.0.1
-      typescript:
-        specifier: '*'
-        version: 5.0.2
       unist-util-visit:
         specifier: ^4.1.2
         version: 4.1.2
@@ -654,6 +648,9 @@ importers:
         specifier: ^3.20.6
         version: 3.20.6
     devDependencies:
+      '@astrojs/check':
+        specifier: ^0.1.0
+        version: 0.1.0(prettier-plugin-astro@0.10.0)(prettier@2.8.8)(typescript@5.1.6)
       '@playwright/test':
         specifier: ^1.29.2
         version: 1.29.2
@@ -4501,7 +4498,7 @@ importers:
         version: file:packages/integrations/netlify(astro@2.9.6)
       astro:
         specifier: file:../../../../../astro
-        version: file:packages/astro(@types/node@18.16.18)
+        version: file:packages/astro(@types/node@18.16.18)(typescript@5.1.6)
 
   packages/integrations/node:
     dependencies:
@@ -5034,7 +5031,7 @@ importers:
         version: file:packages/integrations/vercel(astro@2.9.6)
       astro:
         specifier: file:../../../../../astro
-        version: file:packages/astro(@types/node@18.16.18)
+        version: file:packages/astro(@types/node@18.16.18)(typescript@5.1.6)
 
   packages/integrations/vue:
     dependencies:
@@ -5501,6 +5498,23 @@ packages:
       lite-youtube-embed: 0.2.0
     dev: false
 
+  /@astrojs/check@0.1.0(prettier-plugin-astro@0.10.0)(prettier@2.8.8)(typescript@5.1.6):
+    resolution: {integrity: sha512-tgjq+Vehgv0dwdsRlT4ai3QgT3etn8W5C4E4dvQ0Xe9ccwjKdMTWmpty5exfBtHLLAAOvwe5/OkYQsQ9OyKoVw==}
+    hasBin: true
+    peerDependencies:
+      typescript: ^5.0.0
+    dependencies:
+      '@astrojs/language-server': 2.2.0(prettier-plugin-astro@0.10.0)(prettier@2.8.8)(typescript@5.1.6)
+      chokidar: 3.5.3
+      fast-glob: 3.3.1
+      kleur: 4.1.5
+      typescript: 5.1.6
+      yargs: 17.7.2
+    transitivePeerDependencies:
+      - prettier
+      - prettier-plugin-astro
+    dev: true
+
   /@astrojs/cli-kit@0.2.3:
     resolution: {integrity: sha512-MjB42mpIG/F2rFtdp4f3NylFCILuFSib2yITSq65fRaDFn8+UC8EMh6T7Jr3YqHAbUY5r8V8QWNgH4keOEO2BA==}
     dependencies:
@@ -5509,28 +5523,48 @@ packages:
       sisteransi: 1.0.5
     dev: false
 
+  /@astrojs/compiler@1.5.7:
+    resolution: {integrity: sha512-dFU7GAMbpTUGPkRoCoMQrGFlTe3qIiQMSOxIXp/nB1Do4My9uogjEmBHdR5Cwr4i6rc5/1R3Od9v8kU/pkHXGQ==}
+    dev: true
+
   /@astrojs/compiler@1.6.3:
     resolution: {integrity: sha512-n0xTuBznKspc0plk6RHBOlSv/EwQGyMNSxEOPj7HMeiRNnXX4woeSopN9hQsLkqraDds1eRvB4u99buWgVNJig==}
 
-  /@astrojs/language-server@1.0.0:
-    resolution: {integrity: sha512-oEw7AwJmzjgy6HC9f5IdrphZ1GVgfV/+7xQuyf52cpTiRWd/tJISK3MsKP0cDkVlfodmNABNFnAaAWuLZEiiiA==}
+  /@astrojs/language-server@2.2.0(prettier-plugin-astro@0.10.0)(prettier@2.8.8)(typescript@5.1.6):
+    resolution: {integrity: sha512-zyEumkwcep3pGyMpcEJFEn96jV6pEg3CUtjehnT9KseDFqf+gPYTbw5nwOpN9uXIJ/E5bAxhqpkr3J2LCQHRrg==}
     hasBin: true
+    peerDependencies:
+      prettier: ^3.0.0
+      prettier-plugin-astro: ^0.11.0
+    peerDependenciesMeta:
+      prettier:
+        optional: true
+      prettier-plugin-astro:
+        optional: true
     dependencies:
-      '@astrojs/compiler': 1.6.3
-      '@jridgewell/trace-mapping': 0.3.18
-      '@vscode/emmet-helper': 2.8.8
-      events: 3.3.0
+      '@astrojs/compiler': 1.5.7
+      '@jridgewell/sourcemap-codec': 1.4.15
+      '@volar/kit': 1.10.0(typescript@5.1.6)
+      '@volar/language-core': 1.10.0
+      '@volar/language-server': 1.10.0
+      '@volar/language-service': 1.10.0
+      '@volar/source-map': 1.10.0
+      '@volar/typescript': 1.10.0
+      fast-glob: 3.3.1
+      muggle-string: 0.3.1
       prettier: 2.8.8
-      prettier-plugin-astro: 0.8.1
-      synckit: 0.8.5
-      vscode-css-languageservice: 6.2.6
-      vscode-html-languageservice: 5.0.5
-      vscode-languageserver: 8.1.0
-      vscode-languageserver-protocol: 3.17.3
-      vscode-languageserver-textdocument: 1.0.8
-      vscode-languageserver-types: 3.17.3
+      prettier-plugin-astro: 0.10.0
+      volar-service-css: 0.0.11(@volar/language-service@1.10.0)
+      volar-service-emmet: 0.0.11(@volar/language-service@1.10.0)
+      volar-service-html: 0.0.11(@volar/language-service@1.10.0)
+      volar-service-prettier: 0.0.11(@volar/language-service@1.10.0)(prettier@2.8.8)
+      volar-service-typescript: 0.0.11(@volar/language-service@1.10.0)(@volar/typescript@1.10.0)
+      volar-service-typescript-twoslash-queries: 0.0.11(@volar/language-service@1.10.0)
+      vscode-html-languageservice: 5.0.6
       vscode-uri: 3.0.7
-    dev: false
+    transitivePeerDependencies:
+      - typescript
+    dev: true
 
   /@astrojs/webapi@2.2.0:
     resolution: {integrity: sha512-mHAOApWyjqSe5AQMOUD9rsZJqbMQqe3Wosb1a40JV6Okvyxj1G6GTlthwYadWCymq/lbgwh0PLiY8Fr4eFxtuQ==}
@@ -7397,17 +7431,17 @@ packages:
     resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==}
     dependencies:
       '@emmetio/scanner': 1.0.4
-    dev: false
+    dev: true
 
   /@emmetio/css-abbreviation@2.1.8:
     resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==}
     dependencies:
       '@emmetio/scanner': 1.0.4
-    dev: false
+    dev: true
 
   /@emmetio/scanner@1.0.4:
     resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==}
-    dev: false
+    dev: true
 
   /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.14.47):
     resolution: {integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==}
@@ -8390,18 +8424,6 @@ packages:
       parse5: 7.1.2
     dev: false
 
-  /@pkgr/utils@2.4.0:
-    resolution: {integrity: sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw==}
-    engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
-    dependencies:
-      cross-spawn: 7.0.3
-      fast-glob: 3.2.12
-      is-glob: 4.0.3
-      open: 9.1.0
-      picocolors: 1.0.0
-      tslib: 2.5.3
-    dev: false
-
   /@playwright/test@1.29.2:
     resolution: {integrity: sha512-+3/GPwOgcoF0xLz/opTnahel1/y42PdcgZ4hs+BZGIUjtmEFSXGg+nFoaH3NSmuc7a6GSFwXDJ5L7VXpqzigNg==}
     engines: {node: '>=14'}
@@ -9270,6 +9292,61 @@ packages:
       pretty-format: 27.5.1
     dev: false
 
+  /@volar/kit@1.10.0(typescript@5.1.6):
+    resolution: {integrity: sha512-3ijH2Gqe8kWnij58rwaBID22J/b+VT457ZEf5TwyPDqHTrfNCZIVitpdD5WlLD4Wy/D0Vymwj2ct9TNc1hkOmQ==}
+    peerDependencies:
+      typescript: '*'
+    dependencies:
+      '@volar/language-service': 1.10.0
+      typesafe-path: 0.2.2
+      typescript: 5.1.6
+      vscode-languageserver-textdocument: 1.0.8
+      vscode-uri: 3.0.7
+    dev: true
+
+  /@volar/language-core@1.10.0:
+    resolution: {integrity: sha512-ddyWwSYqcbEZNFHm+Z3NZd6M7Ihjcwl/9B5cZd8kECdimVXUFdFi60XHWD27nrWtUQIsUYIG7Ca1WBwV2u2LSQ==}
+    dependencies:
+      '@volar/source-map': 1.10.0
+    dev: true
+
+  /@volar/language-server@1.10.0:
+    resolution: {integrity: sha512-EFOjdKvV6iCfGmBPuf/L7zK93E8eE/kCBWM5xyG92pJm6tq5R/CLx968CPc7rlWykitKMXJumACNzIeXnnlyEw==}
+    dependencies:
+      '@volar/language-core': 1.10.0
+      '@volar/language-service': 1.10.0
+      '@volar/typescript': 1.10.0
+      '@vscode/l10n': 0.0.11
+      request-light: 0.7.0
+      typesafe-path: 0.2.2
+      vscode-languageserver: 8.1.0
+      vscode-languageserver-protocol: 3.17.3
+      vscode-languageserver-textdocument: 1.0.8
+      vscode-uri: 3.0.7
+    dev: true
+
+  /@volar/language-service@1.10.0:
+    resolution: {integrity: sha512-qWeve/sUwBX94Ozb0A4vDLwjkDJDLz/k0VtRhNzN43PRGaCphl+dYMKftn1e7nYTcfcDKd5HjjfN+tT7txZ6kw==}
+    dependencies:
+      '@volar/language-core': 1.10.0
+      '@volar/source-map': 1.10.0
+      vscode-languageserver-protocol: 3.17.3
+      vscode-languageserver-textdocument: 1.0.8
+      vscode-uri: 3.0.7
+    dev: true
+
+  /@volar/source-map@1.10.0:
+    resolution: {integrity: sha512-/ibWdcOzDGiq/GM1JU2eX8fH1bvAhl66hfe8yEgLEzg9txgr6qb5sQ/DEz5PcDL75tF5H5sCRRwn8Eu8ezi9mw==}
+    dependencies:
+      muggle-string: 0.3.1
+    dev: true
+
+  /@volar/typescript@1.10.0:
+    resolution: {integrity: sha512-OtqGtFbUKYC0pLNIk3mHQp5xWnvL1CJIUc9VE39VdZ/oqpoBh5jKfb9uJ45Y4/oP/WYTrif/Uxl1k8VTPz66Gg==}
+    dependencies:
+      '@volar/language-core': 1.10.0
+    dev: true
+
   /@vscode/emmet-helper@2.8.8:
     resolution: {integrity: sha512-QuD4CmNeXSFxuP8VZwI6qL+8vmmd7JcSdwsEIdsrzb4YumWs/+4rXRX9MM+NsFfUO69g6ezngCD7XRd6jY9TQw==}
     dependencies:
@@ -9278,15 +9355,15 @@ packages:
       vscode-languageserver-textdocument: 1.0.8
       vscode-languageserver-types: 3.17.3
       vscode-uri: 2.1.2
-    dev: false
+    dev: true
 
-  /@vscode/l10n@0.0.13:
-    resolution: {integrity: sha512-A3uY356uOU9nGa+TQIT/i3ziWUgJjVMUrGGXSrtRiTwklyCFjGVWIOHoEIHbJpiyhDkJd9kvIWUOfXK1IkK8XQ==}
-    dev: false
+  /@vscode/l10n@0.0.11:
+    resolution: {integrity: sha512-ukOMWnCg1tCvT7WnDfsUKQOFDQGsyR5tNgRpwmqi+5/vzU3ghdDXzvIM4IOPdSb3OeSsBNvmSL8nxIVOqi2WXA==}
+    dev: true
 
   /@vscode/l10n@0.0.14:
     resolution: {integrity: sha512-/yrv59IEnmh655z1oeDnGcvMYwnEzNzHLgeYcQCkhYX0xBvYWrAuefoiLcPBUkMpJsb46bqQ6Yv4pwTTQ4d3Qg==}
-    dev: false
+    dev: true
 
   /@vue/babel-helper-vue-transform-on@1.0.2:
     resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==}
@@ -9828,11 +9905,6 @@ packages:
       is-windows: 1.0.2
     dev: true
 
-  /big-integer@1.6.51:
-    resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==}
-    engines: {node: '>=0.6'}
-    dev: false
-
   /binary-extensions@2.2.0:
     resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
     engines: {node: '>=8'}
@@ -9897,13 +9969,6 @@ packages:
       wrap-ansi: 8.1.0
     dev: false
 
-  /bplist-parser@0.2.0:
-    resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==}
-    engines: {node: '>= 5.10.0'}
-    dependencies:
-      big-integer: 1.6.51
-    dev: false
-
   /brace-expansion@1.1.11:
     resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
     dependencies:
@@ -9971,13 +10036,6 @@ packages:
       semver: 7.5.4
     dev: true
 
-  /bundle-name@3.0.0:
-    resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==}
-    engines: {node: '>=12'}
-    dependencies:
-      run-applescript: 5.0.0
-    dev: false
-
   /busboy@1.6.0:
     resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
     engines: {node: '>=10.16.0'}
@@ -10665,34 +10723,11 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: false
 
-  /default-browser-id@3.0.0:
-    resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==}
-    engines: {node: '>=12'}
-    dependencies:
-      bplist-parser: 0.2.0
-      untildify: 4.0.0
-    dev: false
-
-  /default-browser@4.0.0:
-    resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==}
-    engines: {node: '>=14.16'}
-    dependencies:
-      bundle-name: 3.0.0
-      default-browser-id: 3.0.0
-      execa: 7.1.1
-      titleize: 3.0.0
-    dev: false
-
   /defaults@1.0.4:
     resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
     dependencies:
       clone: 1.0.4
 
-  /define-lazy-prop@3.0.0:
-    resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
-    engines: {node: '>=12'}
-    dev: false
-
   /define-properties@1.2.0:
     resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
     engines: {node: '>= 0.4'}
@@ -10886,7 +10921,7 @@ packages:
     dependencies:
       '@emmetio/abbreviation': 2.3.3
       '@emmetio/css-abbreviation': 2.1.8
-    dev: false
+    dev: true
 
   /emoji-regex@8.0.0:
     resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -11736,26 +11771,6 @@ packages:
     engines: {node: '>= 0.6'}
     dev: false
 
-  /events@3.3.0:
-    resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
-    engines: {node: '>=0.8.x'}
-    dev: false
-
-  /execa@5.1.1:
-    resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
-    engines: {node: '>=10'}
-    dependencies:
-      cross-spawn: 7.0.3
-      get-stream: 6.0.1
-      human-signals: 2.1.0
-      is-stream: 2.0.1
-      merge-stream: 2.0.0
-      npm-run-path: 4.0.1
-      onetime: 5.1.2
-      signal-exit: 3.0.7
-      strip-final-newline: 2.0.0
-    dev: false
-
   /execa@6.1.0:
     resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -11770,21 +11785,6 @@ packages:
       signal-exit: 3.0.7
       strip-final-newline: 3.0.0
 
-  /execa@7.1.1:
-    resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==}
-    engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
-    dependencies:
-      cross-spawn: 7.0.3
-      get-stream: 6.0.1
-      human-signals: 4.3.1
-      is-stream: 3.0.0
-      merge-stream: 2.0.0
-      npm-run-path: 5.1.0
-      onetime: 6.0.0
-      signal-exit: 3.0.7
-      strip-final-newline: 3.0.0
-    dev: false
-
   /expand-template@2.0.3:
     resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
     engines: {node: '>=6'}
@@ -11828,6 +11828,17 @@ packages:
       merge2: 1.4.1
       micromatch: 4.0.5
 
+  /fast-glob@3.3.1:
+    resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
+    engines: {node: '>=8.6.0'}
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.5
+    dev: true
+
   /fast-json-stable-stringify@2.1.0:
     resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
 
@@ -12636,20 +12647,10 @@ packages:
     resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==}
     dev: true
 
-  /human-signals@2.1.0:
-    resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
-    engines: {node: '>=10.17.0'}
-    dev: false
-
   /human-signals@3.0.1:
     resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==}
     engines: {node: '>=12.20.0'}
 
-  /human-signals@4.3.1:
-    resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
-    engines: {node: '>=14.18.0'}
-    dev: false
-
   /hyperid@3.1.1:
     resolution: {integrity: sha512-RveV33kIksycSf7HLkq1sHB5wW0OwuX8ot8MYnY++gaaPXGFfKpBncHrAWxdpuEeRlazUMGWefwP1w6o6GaumA==}
     dependencies:
@@ -12861,14 +12862,6 @@ packages:
   /is-hexadecimal@2.0.1:
     resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
 
-  /is-inside-container@1.0.0:
-    resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
-    engines: {node: '>=14.16'}
-    hasBin: true
-    dependencies:
-      is-docker: 3.0.0
-    dev: false
-
   /is-interactive@2.0.0:
     resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
     engines: {node: '>=12'}
@@ -13198,7 +13191,7 @@ packages:
 
   /jsonc-parser@2.3.1:
     resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==}
-    dev: false
+    dev: true
 
   /jsonc-parser@3.2.0:
     resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==}
@@ -14351,6 +14344,10 @@ packages:
   /ms@2.1.3:
     resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
 
+  /muggle-string@0.3.1:
+    resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==}
+    dev: true
+
   /mustache@4.2.0:
     resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==}
     hasBin: true
@@ -14399,14 +14396,6 @@ packages:
     engines: {node: '>= 0.4.0'}
     dev: true
 
-  /network-information-types@0.1.1(typescript@5.0.2):
-    resolution: {integrity: sha512-mLXNafJYOkiJB6IlF727YWssTRpXitR+tKSLyA5VAdBi3SOvLf5gtizHgxf241YHPWocnAO/fAhVrB/68tPHDw==}
-    peerDependencies:
-      typescript: '>= 3.0.0'
-    dependencies:
-      typescript: 5.0.2
-    dev: false
-
   /network-information-types@0.1.1(typescript@5.1.6):
     resolution: {integrity: sha512-mLXNafJYOkiJB6IlF727YWssTRpXitR+tKSLyA5VAdBi3SOvLf5gtizHgxf241YHPWocnAO/fAhVrB/68tPHDw==}
     peerDependencies:
@@ -14550,13 +14539,6 @@ packages:
       string.prototype.padend: 3.1.4
     dev: true
 
-  /npm-run-path@4.0.1:
-    resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
-    engines: {node: '>=8'}
-    dependencies:
-      path-key: 3.1.1
-    dev: false
-
   /npm-run-path@5.1.0:
     resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -14652,16 +14634,6 @@ packages:
       which-pm-runs: 1.1.0
     dev: true
 
-  /open@9.1.0:
-    resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==}
-    engines: {node: '>=14.16'}
-    dependencies:
-      default-browser: 4.0.0
-      define-lazy-prop: 3.0.0
-      is-inside-container: 1.0.0
-      is-wsl: 2.2.0
-    dev: false
-
   /optionator@0.8.3:
     resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
     engines: {node: '>= 0.8.0'}
@@ -15494,20 +15466,11 @@ packages:
       sass-formatter: 0.7.6
     dev: true
 
-  /prettier-plugin-astro@0.8.1:
-    resolution: {integrity: sha512-lJ/mG/Lz/ccSwNtwqpFS126mtMVzFVyYv0ddTF9wqwrEG4seECjKDAyw/oGv915rAcJi8jr89990nqfpmG+qdg==}
-    engines: {node: ^14.15.0 || >=16.0.0, pnpm: '>=7.14.0'}
-    dependencies:
-      '@astrojs/compiler': 1.6.3
-      prettier: 2.8.8
-      sass-formatter: 0.7.6
-      synckit: 0.8.5
-    dev: false
-
   /prettier@2.8.8:
     resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
     engines: {node: '>=10.13.0'}
     hasBin: true
+    dev: true
 
   /pretty-bytes@5.6.0:
     resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
@@ -15997,6 +15960,10 @@ packages:
       unified: 10.1.2
     dev: true
 
+  /request-light@0.7.0:
+    resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==}
+    dev: true
+
   /require-directory@2.1.1:
     resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
     engines: {node: '>=0.10.0'}
@@ -16170,13 +16137,6 @@ packages:
     optionalDependencies:
       fsevents: 2.3.2
 
-  /run-applescript@5.0.0:
-    resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==}
-    engines: {node: '>=12'}
-    dependencies:
-      execa: 5.1.1
-    dev: false
-
   /run-parallel@1.2.0:
     resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
     dependencies:
@@ -16184,6 +16144,7 @@ packages:
 
   /s.color@0.0.15:
     resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==}
+    dev: true
 
   /sade@1.8.1:
     resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
@@ -16209,6 +16170,7 @@ packages:
     resolution: {integrity: sha512-hXdxU6PCkiV3XAiSnX+XLqz2ohHoEnVUlrd8LEVMAI80uB1+OTScIkH9n6qQwImZpTye1r1WG1rbGUteHNhoHg==}
     dependencies:
       suf-log: 2.5.3
+    dev: true
 
   /sass@1.63.4:
     resolution: {integrity: sha512-Sx/+weUmK+oiIlI+9sdD0wZHsqpbgQg8wSwSnGBjwb5GwqFhYNwwnI+UWZtLjKvKyFlKkatRK235qQ3mokyPoQ==}
@@ -16744,11 +16706,6 @@ packages:
     engines: {node: '>=10'}
     dev: false
 
-  /strip-final-newline@2.0.0:
-    resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
-    engines: {node: '>=6'}
-    dev: false
-
   /strip-final-newline@3.0.0:
     resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
     engines: {node: '>=12'}
@@ -16812,6 +16769,7 @@ packages:
     resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==}
     dependencies:
       s.color: 0.0.15
+    dev: true
 
   /supports-color@5.5.0:
     resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
@@ -16871,14 +16829,6 @@ packages:
     resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
     dev: true
 
-  /synckit@0.8.5:
-    resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==}
-    engines: {node: ^14.18.0 || >=16.0.0}
-    dependencies:
-      '@pkgr/utils': 2.4.0
-      tslib: 2.5.3
-    dev: false
-
   /tailwindcss@3.3.2:
     resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==}
     engines: {node: '>=14.0.0'}
@@ -17038,11 +16988,6 @@ packages:
     engines: {node: '>=14.0.0'}
     dev: false
 
-  /titleize@3.0.0:
-    resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==}
-    engines: {node: '>=12'}
-    dev: false
-
   /tmp@0.0.33:
     resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
     engines: {node: '>=0.6.0'}
@@ -17302,11 +17247,15 @@ packages:
       for-each: 0.3.3
       is-typed-array: 1.1.10
 
-  /typescript@5.0.2:
-    resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==}
-    engines: {node: '>=12.20'}
-    hasBin: true
-    dev: false
+  /typesafe-path@0.2.2:
+    resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==}
+    dev: true
+
+  /typescript-auto-import-cache@0.3.0:
+    resolution: {integrity: sha512-Rq6/q4O9iyqUdjvOoyas7x/Qf9nWUMeqpP3YeTaLA+uECgfy5wOhfOS+SW/+fZ/uI/ZcKaf+2/ZhFzXh8xfofQ==}
+    dependencies:
+      semver: 7.5.4
+    dev: true
 
   /typescript@5.1.6:
     resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==}
@@ -17531,11 +17480,6 @@ packages:
     engines: {node: '>= 0.8'}
     dev: true
 
-  /untildify@4.0.0:
-    resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
-    engines: {node: '>=8'}
-    dev: false
-
   /upath@1.2.0:
     resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==}
     engines: {node: '>=4'}
@@ -17866,6 +17810,89 @@ packages:
       acorn-walk: 8.2.0
     dev: true
 
+  /volar-service-css@0.0.11(@volar/language-service@1.10.0):
+    resolution: {integrity: sha512-8wkycHM+wSbsRSEvW4GCj3rKJRj+KxnGfRhQC1GfQVx4eMHJHHeSrB4ANPm5mBYbmnJPIxxIgZHp7VoMqDZH4g==}
+    peerDependencies:
+      '@volar/language-service': ~1.10.0
+    peerDependenciesMeta:
+      '@volar/language-service':
+        optional: true
+    dependencies:
+      '@volar/language-service': 1.10.0
+      vscode-css-languageservice: 6.2.6
+      vscode-uri: 3.0.7
+    dev: true
+
+  /volar-service-emmet@0.0.11(@volar/language-service@1.10.0):
+    resolution: {integrity: sha512-9q6F1FaL3q/kxvt8EhbAmW8FtIf8Zi9FMHbuPSOQMn7/JlfXBtkB7y97uXvtQWpoxCumkuhY7kb1iBwtu7U+Eg==}
+    peerDependencies:
+      '@volar/language-service': ~1.10.0
+    peerDependenciesMeta:
+      '@volar/language-service':
+        optional: true
+    dependencies:
+      '@volar/language-service': 1.10.0
+      '@vscode/emmet-helper': 2.8.8
+      volar-service-html: 0.0.11(@volar/language-service@1.10.0)
+    dev: true
+
+  /volar-service-html@0.0.11(@volar/language-service@1.10.0):
+    resolution: {integrity: sha512-Lm8ynBTDI8wMsPwZCoo5s195HBOGCONSZq4sUvrVXPjD1i5eKf+rYIVm7+h/cgbdqZApe8dWFbbqXgLGLodwIA==}
+    peerDependencies:
+      '@volar/language-service': ~1.10.0
+    peerDependenciesMeta:
+      '@volar/language-service':
+        optional: true
+    dependencies:
+      '@volar/language-service': 1.10.0
+      vscode-html-languageservice: 5.0.6
+      vscode-uri: 3.0.7
+    dev: true
+
+  /volar-service-prettier@0.0.11(@volar/language-service@1.10.0)(prettier@2.8.8):
+    resolution: {integrity: sha512-A4vEU5BUitNNAySb+t/fCjEoL01uYUkoe/Fe5UxR3JJbdgr2nTeXb5IlW90/1vzmnTKZznadJV4i1SoAf2CRbg==}
+    peerDependencies:
+      '@volar/language-service': ~1.10.0
+      prettier: ^2.2 || ^3.0
+    peerDependenciesMeta:
+      '@volar/language-service':
+        optional: true
+      prettier:
+        optional: true
+    dependencies:
+      '@volar/language-service': 1.10.0
+      prettier: 2.8.8
+    dev: true
+
+  /volar-service-typescript-twoslash-queries@0.0.11(@volar/language-service@1.10.0):
+    resolution: {integrity: sha512-onNK1g3vZVlPiD9HHFrGVNkdFWndosDSkMUWOWN5PxcocvVuZRZ8TN2iB2Ct0VDIZaXN3PK+fQpPCpq+yy1fXA==}
+    peerDependencies:
+      '@volar/language-service': ~1.10.0
+    peerDependenciesMeta:
+      '@volar/language-service':
+        optional: true
+    dependencies:
+      '@volar/language-service': 1.10.0
+    dev: true
+
+  /volar-service-typescript@0.0.11(@volar/language-service@1.10.0)(@volar/typescript@1.10.0):
+    resolution: {integrity: sha512-l0zY4RuqmLFIdqcKk8IfG2F1M0cn9Km1AdtTld1/kj8KyGhQfe2PsuVjz9wCG6SsR6kQt97YrpscZDvhb5aqQA==}
+    peerDependencies:
+      '@volar/language-service': ~1.10.0
+      '@volar/typescript': ~1.10.0
+    peerDependenciesMeta:
+      '@volar/language-service':
+        optional: true
+    dependencies:
+      '@volar/language-service': 1.10.0
+      '@volar/typescript': 1.10.0
+      semver: 7.5.4
+      typescript-auto-import-cache: 0.3.0
+      vscode-languageserver-textdocument: 1.0.8
+      vscode-nls: 5.2.0
+      vscode-uri: 3.0.7
+    dev: true
+
   /vscode-css-languageservice@6.2.6:
     resolution: {integrity: sha512-SA2WkeOecIpUiEbZnjOsP/fI5CRITZEiQGSHXKiDQDwLApfKcnLhZwMtOBbIifSzESVcQa7b/shX/nbnF4NoCg==}
     dependencies:
@@ -17873,43 +17900,47 @@ packages:
       vscode-languageserver-textdocument: 1.0.8
       vscode-languageserver-types: 3.17.3
       vscode-uri: 3.0.7
-    dev: false
+    dev: true
 
-  /vscode-html-languageservice@5.0.5:
-    resolution: {integrity: sha512-7788ZT+I7/UhFoI4+bzaAiGGZEW7X39kTeuytLtw6jJA6W7ez85bWKYoFDcwrPNmywj3n/IkU9Op9asaje44jg==}
+  /vscode-html-languageservice@5.0.6:
+    resolution: {integrity: sha512-gCixNg6fjPO7+kwSMBAVXcwDRHdjz1WOyNfI0n5Wx0J7dfHG8ggb3zD1FI8E2daTZrwS1cooOiSoc1Xxph4qRQ==}
     dependencies:
-      '@vscode/l10n': 0.0.13
+      '@vscode/l10n': 0.0.14
       vscode-languageserver-textdocument: 1.0.8
       vscode-languageserver-types: 3.17.3
       vscode-uri: 3.0.7
-    dev: false
+    dev: true
 
   /vscode-jsonrpc@8.1.0:
     resolution: {integrity: sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==}
     engines: {node: '>=14.0.0'}
-    dev: false
+    dev: true
 
   /vscode-languageserver-protocol@3.17.3:
     resolution: {integrity: sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==}
     dependencies:
       vscode-jsonrpc: 8.1.0
       vscode-languageserver-types: 3.17.3
-    dev: false
+    dev: true
 
   /vscode-languageserver-textdocument@1.0.8:
     resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==}
-    dev: false
+    dev: true
 
   /vscode-languageserver-types@3.17.3:
     resolution: {integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==}
-    dev: false
+    dev: true
 
   /vscode-languageserver@8.1.0:
     resolution: {integrity: sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw==}
     hasBin: true
     dependencies:
       vscode-languageserver-protocol: 3.17.3
-    dev: false
+    dev: true
+
+  /vscode-nls@5.2.0:
+    resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==}
+    dev: true
 
   /vscode-oniguruma@1.7.0:
     resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==}
@@ -17923,11 +17954,11 @@ packages:
 
   /vscode-uri@2.1.2:
     resolution: {integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==}
-    dev: false
+    dev: true
 
   /vscode-uri@3.0.7:
     resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==}
-    dev: false
+    dev: true
 
   /vue@3.3.4:
     resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==}
@@ -18491,7 +18522,7 @@ packages:
   /zwitch@2.0.4:
     resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
 
-  file:packages/astro(@types/node@18.16.18):
+  file:packages/astro(@types/node@18.16.18)(typescript@5.1.6):
     resolution: {directory: packages/astro, type: directory}
     id: file:packages/astro
     name: astro
@@ -18501,10 +18532,8 @@ packages:
     dependencies:
       '@astrojs/compiler': 1.6.3
       '@astrojs/internal-helpers': link:packages/internal-helpers
-      '@astrojs/language-server': 1.0.0
       '@astrojs/markdown-remark': link:packages/markdown/remark
       '@astrojs/telemetry': link:packages/telemetry
-      '@astrojs/webapi': 2.2.0
       '@babel/core': 7.22.5
       '@babel/generator': 7.22.5
       '@babel/parser': 7.22.5
@@ -18550,7 +18579,6 @@ packages:
       string-width: 5.1.2
       strip-ansi: 7.1.0
       tsconfig-resolver: 3.0.1
-      typescript: 5.1.6
       unist-util-visit: 4.1.2
       vfile: 5.3.7
       vite: 4.4.6(@types/node@18.16.18)(sass@1.63.4)
@@ -18567,6 +18595,7 @@ packages:
       - sugarss
       - supports-color
       - terser
+      - typescript
     dev: false
 
   file:packages/astro/test/fixtures/astro-client-only/pkg:
@@ -18611,7 +18640,7 @@ packages:
       '@astrojs/underscore-redirects': link:packages/underscore-redirects
       '@astrojs/webapi': 2.2.0
       '@netlify/functions': 1.6.0
-      astro: file:packages/astro(@types/node@18.16.18)
+      astro: file:packages/astro(@types/node@18.16.18)(typescript@5.1.6)
       esbuild: 0.18.16
     dev: false
 
@@ -18627,7 +18656,7 @@ packages:
       '@astrojs/webapi': 2.2.0
       '@vercel/analytics': 0.1.11
       '@vercel/nft': 0.22.6
-      astro: file:packages/astro(@types/node@18.16.18)
+      astro: file:packages/astro(@types/node@18.16.18)(typescript@5.1.6)
       esbuild: 0.18.16
       fast-glob: 3.2.12
       set-cookie-parser: 2.6.0