summaryrefslogtreecommitdiff
path: root/packages/astro/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/astro/src')
-rw-r--r--packages/astro/src/assets/types.ts12
-rw-r--r--packages/astro/src/cli/add/index.ts17
-rw-r--r--packages/astro/src/cli/docs/open.ts4
-rw-r--r--packages/astro/src/cli/exec.ts26
-rw-r--r--packages/astro/src/cli/index.ts4
-rw-r--r--packages/astro/src/cli/install-package.ts2
-rw-r--r--packages/astro/src/cli/sync/index.ts7
-rw-r--r--packages/astro/src/config/index.ts10
-rw-r--r--packages/astro/src/core/app/index.ts12
-rw-r--r--packages/astro/src/core/app/node.ts6
-rw-r--r--packages/astro/src/core/build/generate.ts1
-rw-r--r--packages/astro/src/core/build/static-build.ts29
-rw-r--r--packages/astro/src/core/dev/restart.ts7
-rw-r--r--packages/astro/src/core/errors/errors-data.ts2
-rw-r--r--packages/astro/src/core/messages.ts5
-rw-r--r--packages/astro/src/core/sync/index.ts26
-rw-r--r--packages/astro/src/env/runtime-constants.ts1
-rw-r--r--packages/astro/src/env/runtime.ts6
-rw-r--r--packages/astro/src/env/vite-plugin-env.ts7
-rw-r--r--packages/astro/src/preferences/index.ts2
-rw-r--r--packages/astro/src/prefetch/vite-plugin-prefetch.ts22
-rw-r--r--packages/astro/src/runtime/client/dev-toolbar/apps/settings.ts2
-rw-r--r--packages/astro/src/runtime/server/render/component.ts1
-rw-r--r--packages/astro/src/runtime/server/render/util.ts2
-rw-r--r--packages/astro/src/type-utils.ts5
-rw-r--r--packages/astro/src/vite-plugin-astro/index.ts3
26 files changed, 127 insertions, 94 deletions
diff --git a/packages/astro/src/assets/types.ts b/packages/astro/src/assets/types.ts
index 6de28d43c..8bf7a5959 100644
--- a/packages/astro/src/assets/types.ts
+++ b/packages/astro/src/assets/types.ts
@@ -1,4 +1,4 @@
-import type { WithRequired } from '../type-utils.js';
+import type { OmitPreservingIndexSignature, Simplify, WithRequired } from '../type-utils.js';
import type { VALID_INPUT_FORMATS, VALID_OUTPUT_FORMATS } from './consts.js';
import type { ImageService } from './services/service.js';
@@ -66,10 +66,12 @@ export type SrcSetValue = UnresolvedSrcSetValue & {
/**
* A yet to be resolved image transform. Used by `getImage`
*/
-export type UnresolvedImageTransform = Omit<ImageTransform, 'src'> & {
- src: ImageMetadata | string | Promise<{ default: ImageMetadata }>;
- inferSize?: boolean;
-} & {
+export type UnresolvedImageTransform = Simplify<
+ OmitPreservingIndexSignature<ImageTransform, 'src'> & {
+ src: ImageMetadata | string | Promise<{ default: ImageMetadata }>;
+ inferSize?: boolean;
+ }
+> & {
[isESMImport]?: never;
};
diff --git a/packages/astro/src/cli/add/index.ts b/packages/astro/src/cli/add/index.ts
index caa6c38e7..6ccd4070d 100644
--- a/packages/astro/src/cli/add/index.ts
+++ b/packages/astro/src/cli/add/index.ts
@@ -9,7 +9,6 @@ import { getDefaultExportOptions } from 'magicast/helpers';
import preferredPM from 'preferred-pm';
import prompts from 'prompts';
import maxSatisfying from 'semver/ranges/max-satisfying.js';
-import { exec } from 'tinyexec';
import yoctoSpinner from 'yocto-spinner';
import {
loadTSConfig,
@@ -30,6 +29,7 @@ import { appendForwardSlash } from '../../core/path.js';
import { apply as applyPolyfill } from '../../core/polyfill.js';
import { ensureProcessNodeEnv, parseNpmName } from '../../core/util.js';
import { eventCliSession, telemetry } from '../../events/index.js';
+import { exec } from '../exec.js';
import { type Flags, createLoggerFromFlags, flagsToAstroInlineConfig } from '../flags.js';
import { fetchPackageJson, fetchPackageVersions } from '../install-package.js';
@@ -344,7 +344,11 @@ export async function add(names: string[], { flags }: AddOptions) {
logger.info('SKIP_FORMAT', msg.success(`Configuration up-to-date.`));
break;
}
- default: {
+ // NOTE: failure shouldn't happen in practice because `updateAstroConfig` doesn't return that.
+ // Pipe this to the same handling as `UpdateResult.updated` for now.
+ case UpdateResult.failure:
+ case UpdateResult.updated:
+ case undefined: {
const list = integrations.map((integration) => ` - ${integration.packageName}`).join('\n');
logger.info(
'SKIP_FORMAT',
@@ -375,7 +379,7 @@ export async function add(names: string[], { flags }: AddOptions) {
`Unknown error parsing tsconfig.json or jsconfig.json. Could not update TypeScript settings.`,
);
}
- default:
+ case UpdateResult.updated:
logger.info('SKIP_FORMAT', msg.success(`Successfully updated TypeScript settings`));
}
}
@@ -390,13 +394,16 @@ function isAdapter(
// Some examples:
// - @astrojs/image => image
// - @astrojs/markdown-component => markdownComponent
+// - @astrojs/image@beta => image
// - astro-cast => cast
+// - astro-cast@next => cast
// - markdown-astro => markdown
// - some-package => somePackage
// - example.com => exampleCom
// - under_score => underScore
// - 123numeric => numeric
// - @npm/thingy => npmThingy
+// - @npm/thingy@1.2.3 => npmThingy
// - @jane/foo.js => janeFoo
// - @tokencss/astro => tokencss
const toIdent = (name: string) => {
@@ -409,7 +416,9 @@ const toIdent = (name: string) => {
// convert to camel case
.replace(/[.\-_/]+([a-zA-Z])/g, (_, w) => w.toUpperCase())
// drop invalid first characters
- .replace(/^[^a-zA-Z$_]+/, '');
+ .replace(/^[^a-zA-Z$_]+/, '')
+ // drop version or tag
+ .replace(/@.*$/, '');
return `${ident[0].toLowerCase()}${ident.slice(1)}`;
};
diff --git a/packages/astro/src/cli/docs/open.ts b/packages/astro/src/cli/docs/open.ts
index 6f2fe4c82..b37028449 100644
--- a/packages/astro/src/cli/docs/open.ts
+++ b/packages/astro/src/cli/docs/open.ts
@@ -1,4 +1,5 @@
-import { type Result, exec } from 'tinyexec';
+import type { Result } from 'tinyexec';
+import { exec } from '../exec.js';
/**
* Credit: Azhar22
@@ -8,6 +9,7 @@ const getPlatformSpecificCommand = (): [string] | [string, string[]] => {
const isGitPod = Boolean(process.env.GITPOD_REPO_ROOT);
const platform = isGitPod ? 'gitpod' : process.platform;
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
switch (platform) {
case 'android':
case 'linux':
diff --git a/packages/astro/src/cli/exec.ts b/packages/astro/src/cli/exec.ts
new file mode 100644
index 000000000..b2af3c377
--- /dev/null
+++ b/packages/astro/src/cli/exec.ts
@@ -0,0 +1,26 @@
+import { NonZeroExitError, type Options, x } from 'tinyexec';
+
+/**
+ * Improve tinyexec error logging and set `throwOnError` to `true` by default
+ */
+export function exec(command: string, args?: string[], options?: Partial<Options>) {
+ return x(command, args, {
+ throwOnError: true,
+ ...options,
+ }).then(
+ (o) => o,
+ (e) => {
+ if (e instanceof NonZeroExitError) {
+ const fullCommand = args?.length
+ ? `${command} ${args.map((a) => (a.includes(' ') ? `"${a}"` : a)).join(' ')}`
+ : command;
+ const message = `The command \`${fullCommand}\` exited with code ${e.exitCode}`;
+ const newError = new Error(message, e.cause ? { cause: e.cause } : undefined);
+ (newError as any).stderr = e.output?.stderr;
+ (newError as any).stdout = e.output?.stdout;
+ throw newError;
+ }
+ throw e;
+ },
+ );
+}
diff --git a/packages/astro/src/cli/index.ts b/packages/astro/src/cli/index.ts
index a963b8414..8511a8304 100644
--- a/packages/astro/src/cli/index.ts
+++ b/packages/astro/src/cli/index.ts
@@ -133,8 +133,8 @@ async function runCommand(cmd: string, flags: yargs.Arguments) {
}
case 'sync': {
const { sync } = await import('./sync/index.js');
- const exitCode = await sync({ flags });
- return process.exit(exitCode);
+ await sync({ flags });
+ return;
}
case 'preferences': {
const { preferences } = await import('./preferences/index.js');
diff --git a/packages/astro/src/cli/install-package.ts b/packages/astro/src/cli/install-package.ts
index 258fc884f..2b3dc80bd 100644
--- a/packages/astro/src/cli/install-package.ts
+++ b/packages/astro/src/cli/install-package.ts
@@ -4,10 +4,10 @@ import ci from 'ci-info';
import { bold, cyan, dim, magenta } from 'kleur/colors';
import preferredPM from 'preferred-pm';
import prompts from 'prompts';
-import { exec } from 'tinyexec';
import whichPm from 'which-pm';
import yoctoSpinner from 'yocto-spinner';
import type { Logger } from '../core/logger/core.js';
+import { exec } from './exec.js';
const require = createRequire(import.meta.url);
diff --git a/packages/astro/src/cli/sync/index.ts b/packages/astro/src/cli/sync/index.ts
index 7ffe662c5..7f488836d 100644
--- a/packages/astro/src/cli/sync/index.ts
+++ b/packages/astro/src/cli/sync/index.ts
@@ -22,10 +22,5 @@ export async function sync({ flags }: SyncOptions) {
return 0;
}
- try {
- await _sync(flagsToAstroInlineConfig(flags), { telemetry: true });
- return 0;
- } catch (_) {
- return 1;
- }
+ await _sync(flagsToAstroInlineConfig(flags), { telemetry: true });
}
diff --git a/packages/astro/src/config/index.ts b/packages/astro/src/config/index.ts
index 62316377a..534dc4330 100644
--- a/packages/astro/src/config/index.ts
+++ b/packages/astro/src/config/index.ts
@@ -1,5 +1,4 @@
import type { UserConfig as ViteUserConfig, UserConfigFn as ViteUserConfigFn } from 'vite';
-import { Logger } from '../core/logger/core.js';
import { createRouteManifest } from '../core/routing/index.js';
import type { AstroInlineConfig, AstroUserConfig, Locales } from '../types/public/config.js';
import { createDevelopmentManifest } from '../vite-plugin-astro-server/plugin.js';
@@ -30,7 +29,7 @@ export function getViteConfig(
const [
fs,
{ mergeConfig },
- { nodeLogDestination },
+ { createNodeLogger },
{ resolveConfig, createSettings },
{ createVite },
{ runHookConfigSetup, runHookConfigDone },
@@ -38,16 +37,13 @@ export function getViteConfig(
] = await Promise.all([
import('node:fs'),
import('vite'),
- import('../core/logger/node.js'),
+ import('../core/config/logging.js'),
import('../core/config/index.js'),
import('../core/create-vite.js'),
import('../integrations/hooks.js'),
import('./vite-plugin-content-listen.js'),
]);
- const logger = new Logger({
- dest: nodeLogDestination,
- level: 'info',
- });
+ const logger = createNodeLogger(inlineAstroConfig);
const { astroConfig: config } = await resolveConfig(inlineAstroConfig, cmd);
let settings = await createSettings(config, userViteConfig.root);
settings = await runHookConfigSetup({ settings, command: cmd, logger });
diff --git a/packages/astro/src/core/app/index.ts b/packages/astro/src/core/app/index.ts
index 48c6a12aa..09b3edea1 100644
--- a/packages/astro/src/core/app/index.ts
+++ b/packages/astro/src/core/app/index.ts
@@ -122,14 +122,10 @@ export class App {
throw new Error(`Unable to resolve [${specifier}]`);
}
const bundlePath = this.#manifest.entryModules[specifier];
- switch (true) {
- case bundlePath.startsWith('data:'):
- case bundlePath.length === 0: {
- return bundlePath;
- }
- default: {
- return createAssetLink(bundlePath, this.#manifest.base, this.#manifest.assetsPrefix);
- }
+ if (bundlePath.startsWith('data:') || bundlePath.length === 0) {
+ return bundlePath;
+ } else {
+ return createAssetLink(bundlePath, this.#manifest.base, this.#manifest.assetsPrefix);
}
},
serverLike: true,
diff --git a/packages/astro/src/core/app/node.ts b/packages/astro/src/core/app/node.ts
index f7e9fd1f5..79e649ed5 100644
--- a/packages/astro/src/core/app/node.ts
+++ b/packages/astro/src/core/app/node.ts
@@ -153,8 +153,10 @@ export class NodeApp extends App {
}
destination.end();
// the error will be logged by the "on end" callback above
- } catch {
- destination.end('Internal server error');
+ } catch (err) {
+ destination.write('Internal server error', () => {
+ err instanceof Error ? destination.destroy(err) : destination.destroy();
+ });
}
}
}
diff --git a/packages/astro/src/core/build/generate.ts b/packages/astro/src/core/build/generate.ts
index a26eca79b..1a35e06a4 100644
--- a/packages/astro/src/core/build/generate.ts
+++ b/packages/astro/src/core/build/generate.ts
@@ -370,6 +370,7 @@ function getUrlForPath(
ending = trailingSlash === 'never' ? '' : '/';
break;
}
+ case 'file':
default: {
ending = '.html';
break;
diff --git a/packages/astro/src/core/build/static-build.ts b/packages/astro/src/core/build/static-build.ts
index b000b28b7..bf1dddf56 100644
--- a/packages/astro/src/core/build/static-build.ts
+++ b/packages/astro/src/core/build/static-build.ts
@@ -122,24 +122,17 @@ export async function staticBuild(
contentFileNames?: string[],
) {
const { settings } = opts;
- switch (settings.buildOutput) {
- case 'static': {
- settings.timer.start('Static generate');
- await generatePages(opts, internals);
- await cleanServerOutput(opts, ssrOutputChunkNames, contentFileNames, internals);
- settings.timer.end('Static generate');
- return;
- }
- case 'server': {
- settings.timer.start('Server generate');
- await generatePages(opts, internals);
- await cleanStaticOutput(opts, internals);
- await ssrMoveAssets(opts);
- settings.timer.end('Server generate');
- return;
- }
- default: // `settings.buildOutput` will always be one of the above at this point, but TS doesn't know that
- return;
+ if (settings.buildOutput === 'static') {
+ settings.timer.start('Static generate');
+ await generatePages(opts, internals);
+ await cleanServerOutput(opts, ssrOutputChunkNames, contentFileNames, internals);
+ settings.timer.end('Static generate');
+ } else if (settings.buildOutput === 'server') {
+ settings.timer.start('Server generate');
+ await generatePages(opts, internals);
+ await cleanStaticOutput(opts, internals);
+ await ssrMoveAssets(opts);
+ settings.timer.end('Server generate');
}
}
diff --git a/packages/astro/src/core/dev/restart.ts b/packages/astro/src/core/dev/restart.ts
index e9ac726f6..d6c0d0513 100644
--- a/packages/astro/src/core/dev/restart.ts
+++ b/packages/astro/src/core/dev/restart.ts
@@ -176,8 +176,11 @@ export async function createContainerWithAutomaticRestart({
// Restart the Astro dev server instead of Vite's when the API is called by plugins.
// Ignore the `forceOptimize` parameter for now.
- restart.container.viteServer.restart = () =>
- handleServerRestart('', restart.container.viteServer);
+ restart.container.viteServer.restart = async () => {
+ if (!restart.container.restartInFlight) {
+ await handleServerRestart('', restart.container.viteServer);
+ }
+ };
// Set up shortcuts
diff --git a/packages/astro/src/core/errors/errors-data.ts b/packages/astro/src/core/errors/errors-data.ts
index 3b50c2223..6b3c7c141 100644
--- a/packages/astro/src/core/errors/errors-data.ts
+++ b/packages/astro/src/core/errors/errors-data.ts
@@ -1429,7 +1429,7 @@ export const GenerateContentTypesError = {
title: 'Failed to generate content types.',
message: (errorMessage: string) =>
`\`astro sync\` command failed to generate content collection types: ${errorMessage}`,
- hint: 'Check your `src/content/config.*` file for typos.',
+ hint: 'This error is often caused by a syntax error inside your content, or your content configuration file. Check your `src/content/config.*` file for typos.',
} satisfies ErrorData;
/**
* @docs
diff --git a/packages/astro/src/core/messages.ts b/packages/astro/src/core/messages.ts
index 3081c0b6c..57c44b065 100644
--- a/packages/astro/src/core/messages.ts
+++ b/packages/astro/src/core/messages.ts
@@ -298,6 +298,11 @@ export function formatErrorMessage(err: ErrorWithMetadata, showFullStacktrace: b
output.push(` ${cyan(underline(docsLink))}`);
}
+ if (showFullStacktrace && err.loc) {
+ output.push(` ${bold('Location:')}`);
+ output.push(` ${underline(`${err.loc.file}:${err.loc.line ?? 0}:${err.loc.column ?? 0}`)}`);
+ }
+
if (err.stack) {
output.push(` ${bold('Stack trace:')}`);
output.push(dim(formatErrorStackTrace(err, showFullStacktrace)));
diff --git a/packages/astro/src/core/sync/index.ts b/packages/astro/src/core/sync/index.ts
index bedef5bcc..6d16cf541 100644
--- a/packages/astro/src/core/sync/index.ts
+++ b/packages/astro/src/core/sync/index.ts
@@ -26,6 +26,7 @@ import {
AstroError,
AstroErrorData,
AstroUserError,
+ type ErrorWithMetadata,
createSafeError,
isAstroError,
} from '../errors/index.js';
@@ -68,17 +69,7 @@ export default async function sync(
});
const manifest = await createRouteManifest({ settings, fsMod: fs }, logger);
- // Run `astro:config:done`
- // Actions will throw if there is misconfiguration, so catch here.
- try {
- await runHookConfigDone({ settings, logger });
- } catch (err) {
- if (err instanceof Error) {
- const errorMessage = err.toString();
- logger.error('sync', errorMessage);
- }
- throw err;
- }
+ await runHookConfigDone({ settings, logger });
return await syncInternal({
settings,
@@ -127,7 +118,6 @@ export async function syncInternal({
const timerStart = performance.now();
- try {
if (!skip?.content) {
await syncContentCollections(settings, { mode, fs, logger, manifest });
settings.timer.start('Sync content layer');
@@ -163,15 +153,6 @@ export async function syncInternal({
writeInjectedTypes(settings, fs);
logger.info('types', `Generated ${dim(getTimeStat(timerStart, performance.now()))}`);
- } catch (err) {
- const error = createSafeError(err);
- logger.error(
- 'types',
- formatErrorMessage(collectErrorMetadata(error), logger.level() === 'debug') + '\n',
- );
- // Will return exit code 1 in CLI
- throw error;
- }
}
function getTsReference(type: 'path' | 'types', value: string) {
@@ -270,7 +251,7 @@ async function syncContentCollections(
}
}
} catch (e) {
- const safeError = createSafeError(e);
+ const safeError = createSafeError(e) as ErrorWithMetadata;
if (isAstroError(e)) {
throw e;
}
@@ -280,6 +261,7 @@ async function syncContentCollections(
...AstroErrorData.GenerateContentTypesError,
hint,
message: AstroErrorData.GenerateContentTypesError.message(safeError.message),
+ location: safeError.loc,
},
{ cause: e },
);
diff --git a/packages/astro/src/env/runtime-constants.ts b/packages/astro/src/env/runtime-constants.ts
deleted file mode 100644
index 27b5d7211..000000000
--- a/packages/astro/src/env/runtime-constants.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const ENV_SYMBOL = Symbol.for('astro:env/dev');
diff --git a/packages/astro/src/env/runtime.ts b/packages/astro/src/env/runtime.ts
index 50684f63e..a2017b617 100644
--- a/packages/astro/src/env/runtime.ts
+++ b/packages/astro/src/env/runtime.ts
@@ -1,16 +1,12 @@
import { AstroError, AstroErrorData } from '../core/errors/index.js';
import { invalidVariablesToError } from './errors.js';
-import { ENV_SYMBOL } from './runtime-constants.js';
import type { ValidationResultInvalid } from './validators.js';
export { validateEnvVariable, getEnvFieldType } from './validators.js';
export type GetEnv = (key: string) => string | undefined;
type OnSetGetEnv = (reset: boolean) => void;
-let _getEnv: GetEnv = (key) => {
- const env = (globalThis as any)[ENV_SYMBOL] ?? {};
- return env[key];
-};
+let _getEnv: GetEnv = (key) => process.env[key];
export function setGetEnv(fn: GetEnv, reset = false) {
_getEnv = fn;
diff --git a/packages/astro/src/env/vite-plugin-env.ts b/packages/astro/src/env/vite-plugin-env.ts
index 0259ec7fe..816f460b3 100644
--- a/packages/astro/src/env/vite-plugin-env.ts
+++ b/packages/astro/src/env/vite-plugin-env.ts
@@ -9,7 +9,6 @@ import {
VIRTUAL_MODULES_IDS_VALUES,
} from './constants.js';
import { type InvalidVariable, invalidVariablesToError } from './errors.js';
-import { ENV_SYMBOL } from './runtime-constants.js';
import type { EnvSchema } from './schema.js';
import { getEnvFieldType, validateEnvVariable } from './validators.js';
@@ -29,7 +28,11 @@ export function astroEnv({ settings, mode, sync }: AstroEnvPluginParams): Plugin
enforce: 'pre',
buildStart() {
const loadedEnv = loadEnv(mode, fileURLToPath(settings.config.root), '');
- (globalThis as any)[ENV_SYMBOL] = loadedEnv;
+ for (const [key, value] of Object.entries(loadedEnv)) {
+ if (value !== undefined) {
+ process.env[key] = value;
+ }
+ }
const validatedVariables = validatePublicVariables({
schema,
diff --git a/packages/astro/src/preferences/index.ts b/packages/astro/src/preferences/index.ts
index 7c8779b43..e34486739 100644
--- a/packages/astro/src/preferences/index.ts
+++ b/packages/astro/src/preferences/index.ts
@@ -65,6 +65,7 @@ export function isValidKey(key: string): key is PreferenceKey {
}
export function coerce(key: string, value: unknown) {
const type = typeof dget(DEFAULT_PREFERENCES, key);
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
switch (type) {
case 'string':
return value;
@@ -142,6 +143,7 @@ function getGlobalPreferenceDir() {
const { XDG_CONFIG_HOME = path.join(homedir, '.config') } = process.env;
return path.join(XDG_CONFIG_HOME, name);
};
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
switch (process.platform) {
case 'darwin':
return macos();
diff --git a/packages/astro/src/prefetch/vite-plugin-prefetch.ts b/packages/astro/src/prefetch/vite-plugin-prefetch.ts
index 560895b15..c908e7cc2 100644
--- a/packages/astro/src/prefetch/vite-plugin-prefetch.ts
+++ b/packages/astro/src/prefetch/vite-plugin-prefetch.ts
@@ -45,15 +45,25 @@ export default function astroPrefetch({ settings }: { settings: AstroSettings })
},
transform(code, id) {
// NOTE: Handle replacing the specifiers even if prefetch is disabled so View Transitions
- // can import the internal module as not hit runtime issues.
+ // can import the internal module and not hit runtime issues.
if (id.includes(prefetchInternalModuleFsSubpath)) {
- return code
- .replace('__PREFETCH_PREFETCH_ALL__', JSON.stringify(prefetch?.prefetchAll))
- .replace('__PREFETCH_DEFAULT_STRATEGY__', JSON.stringify(prefetch?.defaultStrategy))
+ // We perform a simple replacement with padding so that the code offset is not changed and
+ // we don't have to generate a sourcemap. This has the assumption that the replaced string
+ // will always be shorter than the search string to work.
+ code = code
.replace(
- '__EXPERIMENTAL_CLIENT_PRERENDER__',
- JSON.stringify(settings.config.experimental.clientPrerender),
+ '__PREFETCH_PREFETCH_ALL__', // length: 25
+ `${JSON.stringify(prefetch?.prefetchAll)}`.padEnd(25),
+ )
+ .replace(
+ '__PREFETCH_DEFAULT_STRATEGY__', // length: 29
+ `${JSON.stringify(prefetch?.defaultStrategy)}`.padEnd(29),
+ )
+ .replace(
+ '__EXPERIMENTAL_CLIENT_PRERENDER__', // length: 33
+ `${JSON.stringify(settings.config.experimental.clientPrerender)}`.padEnd(33),
);
+ return { code, map: null };
}
},
};
diff --git a/packages/astro/src/runtime/client/dev-toolbar/apps/settings.ts b/packages/astro/src/runtime/client/dev-toolbar/apps/settings.ts
index 547dea287..09fa8da26 100644
--- a/packages/astro/src/runtime/client/dev-toolbar/apps/settings.ts
+++ b/packages/astro/src/runtime/client/dev-toolbar/apps/settings.ts
@@ -204,6 +204,8 @@ export default {
label.append(astroSelect);
break;
}
+ case 'number':
+ case 'text':
default:
break;
}
diff --git a/packages/astro/src/runtime/server/render/component.ts b/packages/astro/src/runtime/server/render/component.ts
index b7af9cd92..eedbcbee1 100644
--- a/packages/astro/src/runtime/server/render/component.ts
+++ b/packages/astro/src/runtime/server/render/component.ts
@@ -44,6 +44,7 @@ function guessRenderers(componentUrl?: string): string[] {
case 'jsx':
case 'tsx':
return ['@astrojs/react', '@astrojs/preact', '@astrojs/solid-js', '@astrojs/vue (jsx)'];
+ case undefined:
default:
return [
'@astrojs/react',
diff --git a/packages/astro/src/runtime/server/render/util.ts b/packages/astro/src/runtime/server/render/util.ts
index 2373d624c..45c0345e5 100644
--- a/packages/astro/src/runtime/server/render/util.ts
+++ b/packages/astro/src/runtime/server/render/util.ts
@@ -7,7 +7,7 @@ import { HTMLString, markHTMLString } from '../escape.js';
export const voidElementNames =
/^(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/i;
const htmlBooleanAttributes =
- /^(?:allowfullscreen|async|autofocus|autoplay|controls|default|defer|disabled|disablepictureinpicture|disableremoteplayback|formnovalidate|hidden|loop|nomodule|novalidate|open|playsinline|readonly|required|reversed|scoped|seamless|selected|itemscope)$/i;
+ /^(?:allowfullscreen|async|autofocus|autoplay|checked|controls|default|defer|disabled|disablepictureinpicture|disableremoteplayback|formnovalidate|hidden|loop|nomodule|novalidate|open|playsinline|readonly|required|reversed|scoped|seamless|selected|itemscope)$/i;
const AMPERSAND_REGEX = /&/g;
const DOUBLE_QUOTE_REGEX = /"/g;
diff --git a/packages/astro/src/type-utils.ts b/packages/astro/src/type-utils.ts
index daf1052e1..1aa816aad 100644
--- a/packages/astro/src/type-utils.ts
+++ b/packages/astro/src/type-utils.ts
@@ -16,6 +16,11 @@ export type OmitIndexSignature<ObjectType> = {
: KeyType]: ObjectType[KeyType];
};
+// This is an alternative `Omit<T, K>` implementation that _doesn't_ remove the index signature of an object.
+export type OmitPreservingIndexSignature<T, K extends PropertyKey> = {
+ [P in keyof T as Exclude<P, K>]: T[P];
+};
+
// Transform a string into its kebab case equivalent (camelCase -> kebab-case). Useful for CSS-in-JS to CSS.
export type Kebab<T extends string, A extends string = ''> = T extends `${infer F}${infer R}`
? Kebab<R, `${A}${F extends Lowercase<F> ? '' : '-'}${Lowercase<F>}`>
diff --git a/packages/astro/src/vite-plugin-astro/index.ts b/packages/astro/src/vite-plugin-astro/index.ts
index dc5fe80a1..1214467e2 100644
--- a/packages/astro/src/vite-plugin-astro/index.ts
+++ b/packages/astro/src/vite-plugin-astro/index.ts
@@ -189,6 +189,9 @@ export default function astro({ settings, logger }: AstroPluginOptions): vite.Pl
return result;
}
+ case 'custom':
+ case 'template':
+ case undefined:
default:
return null;
}