diff options
Diffstat (limited to 'packages/astro/src')
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; } |