From a9373c0c9a3c2e1773fc11bb14e156698b0d9d38 Mon Sep 17 00:00:00 2001 From: Florian Lefebvre Date: Mon, 9 Dec 2024 13:29:44 +0100 Subject: [PATCH 01/35] fix: do not freeze process.env in dev (#12585) Co-authored-by: Emanuele Stoppa --- .changeset/nasty-parrots-cry.md | 5 ++ packages/astro/src/container/index.ts | 1 - packages/astro/src/core/app/types.ts | 1 - packages/astro/src/core/build/generate.ts | 1 - .../src/core/build/plugins/plugin-manifest.ts | 3 - packages/astro/src/core/create-vite.ts | 6 +- packages/astro/src/env/env-loader.ts | 60 +++++++++++++++++++ packages/astro/src/env/runtime.ts | 6 +- packages/astro/src/env/vite-plugin-env.ts | 32 +++++++--- .../src/vite-plugin-astro-server/plugin.ts | 1 - packages/astro/src/vite-plugin-env/index.ts | 60 ++----------------- packages/astro/templates/env.mjs | 18 ++++-- 12 files changed, 113 insertions(+), 81 deletions(-) create mode 100644 .changeset/nasty-parrots-cry.md create mode 100644 packages/astro/src/env/env-loader.ts diff --git a/.changeset/nasty-parrots-cry.md b/.changeset/nasty-parrots-cry.md new file mode 100644 index 0000000000..be25a64c2a --- /dev/null +++ b/.changeset/nasty-parrots-cry.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fixes a case where `process.env` would be frozen despite changes made to environment variables in development \ No newline at end of file diff --git a/packages/astro/src/container/index.ts b/packages/astro/src/container/index.ts index 9ca9d23001..7a31af8a7a 100644 --- a/packages/astro/src/container/index.ts +++ b/packages/astro/src/container/index.ts @@ -155,7 +155,6 @@ function createManifest( i18n: manifest?.i18n, checkOrigin: false, middleware: manifest?.middleware ?? middlewareInstance, - envGetSecretEnabled: false, key: createKey(), }; } diff --git a/packages/astro/src/core/app/types.ts b/packages/astro/src/core/app/types.ts index 0fb627f718..2417902500 100644 --- a/packages/astro/src/core/app/types.ts +++ b/packages/astro/src/core/app/types.ts @@ -69,7 +69,6 @@ export type SSRManifest = { i18n: SSRManifestI18n | undefined; middleware?: () => Promise | AstroMiddlewareInstance; checkOrigin: boolean; - envGetSecretEnabled: boolean; }; export type SSRManifestI18n = { diff --git a/packages/astro/src/core/build/generate.ts b/packages/astro/src/core/build/generate.ts index 47d6ef3def..75b138c27e 100644 --- a/packages/astro/src/core/build/generate.ts +++ b/packages/astro/src/core/build/generate.ts @@ -559,6 +559,5 @@ function createBuildManifest( checkOrigin: (settings.config.security?.checkOrigin && settings.buildOutput === 'server') ?? false, key, - envGetSecretEnabled: false, }; } diff --git a/packages/astro/src/core/build/plugins/plugin-manifest.ts b/packages/astro/src/core/build/plugins/plugin-manifest.ts index 12fdf65b17..caebb470d5 100644 --- a/packages/astro/src/core/build/plugins/plugin-manifest.ts +++ b/packages/astro/src/core/build/plugins/plugin-manifest.ts @@ -274,8 +274,5 @@ function buildManifest( (settings.config.security?.checkOrigin && settings.buildOutput === 'server') ?? false, serverIslandNameMap: Array.from(settings.serverIslandNameMap), key: encodedKey, - envGetSecretEnabled: - (unwrapSupportKind(settings.adapter?.supportedAstroFeatures.envGetSecret) ?? - 'unsupported') !== 'unsupported', }; } diff --git a/packages/astro/src/core/create-vite.ts b/packages/astro/src/core/create-vite.ts index 7b680c4055..784ef5f83f 100644 --- a/packages/astro/src/core/create-vite.ts +++ b/packages/astro/src/core/create-vite.ts @@ -41,6 +41,7 @@ import { vitePluginMiddleware } from './middleware/vite-plugin.js'; import { joinPaths } from './path.js'; import { vitePluginServerIslands } from './server-islands/vite-plugin-server-islands.js'; import { isObject } from './util.js'; +import { createEnvLoader } from '../env/env-loader.js'; type CreateViteOptions = { settings: AstroSettings; @@ -123,6 +124,7 @@ export async function createVite( }); const srcDirPattern = glob.convertPathToPattern(fileURLToPath(settings.config.srcDir)); + const envLoader = createEnvLoader(); // Start with the Vite configuration that Astro core needs const commonConfig: vite.InlineConfig = { @@ -146,8 +148,8 @@ export async function createVite( // The server plugin is for dev only and having it run during the build causes // the build to run very slow as the filewatcher is triggered often. command === 'dev' && vitePluginAstroServer({ settings, logger, fs, manifest, ssrManifest }), // ssrManifest is only required in dev mode, where it gets created before a Vite instance is created, and get passed to this function - envVitePlugin({ settings }), - astroEnv({ settings, mode, sync }), + envVitePlugin({ envLoader }), + astroEnv({ settings, mode, sync, envLoader }), markdownVitePlugin({ settings, logger }), htmlVitePlugin(), astroPostprocessVitePlugin(), diff --git a/packages/astro/src/env/env-loader.ts b/packages/astro/src/env/env-loader.ts new file mode 100644 index 0000000000..f33878a652 --- /dev/null +++ b/packages/astro/src/env/env-loader.ts @@ -0,0 +1,60 @@ +import { loadEnv } from 'vite'; +import type { AstroConfig } from '../types/public/index.js'; +import { fileURLToPath } from 'node:url'; + +// Match valid JS variable names (identifiers), which accepts most alphanumeric characters, +// except that the first character cannot be a number. +const isValidIdentifierRe = /^[_$a-zA-Z][\w$]*$/; + +function getPrivateEnv( + fullEnv: Record, + astroConfig: AstroConfig, +): Record { + const viteConfig = astroConfig.vite; + let envPrefixes: string[] = ['PUBLIC_']; + if (viteConfig.envPrefix) { + envPrefixes = Array.isArray(viteConfig.envPrefix) + ? viteConfig.envPrefix + : [viteConfig.envPrefix]; + } + + const privateEnv: Record = {}; + for (const key in fullEnv) { + // Ignore public env var + if (isValidIdentifierRe.test(key) && envPrefixes.every((prefix) => !key.startsWith(prefix))) { + if (typeof process.env[key] !== 'undefined') { + let value = process.env[key]; + // Replacements are always strings, so try to convert to strings here first + if (typeof value !== 'string') { + value = `${value}`; + } + // Boolean values should be inlined to support `export const prerender` + // We already know that these are NOT sensitive values, so inlining is safe + if (value === '0' || value === '1' || value === 'true' || value === 'false') { + privateEnv[key] = value; + } else { + privateEnv[key] = `process.env.${key}`; + } + } else { + privateEnv[key] = JSON.stringify(fullEnv[key]); + } + } + } + return privateEnv; +} + +export const createEnvLoader = () => { + let privateEnv: Record = {}; + return { + load: (mode: string, config: AstroConfig) => { + const loaded = loadEnv(mode, config.vite.envDir ?? fileURLToPath(config.root), ''); + privateEnv = getPrivateEnv(loaded, config); + return loaded; + }, + getPrivateEnv: () => { + return privateEnv; + }, + }; +}; + +export type EnvLoader = ReturnType; diff --git a/packages/astro/src/env/runtime.ts b/packages/astro/src/env/runtime.ts index a2017b617f..25a87d4bcf 100644 --- a/packages/astro/src/env/runtime.ts +++ b/packages/astro/src/env/runtime.ts @@ -4,14 +4,14 @@ import type { ValidationResultInvalid } from './validators.js'; export { validateEnvVariable, getEnvFieldType } from './validators.js'; export type GetEnv = (key: string) => string | undefined; -type OnSetGetEnv = (reset: boolean) => void; +type OnSetGetEnv = () => void; let _getEnv: GetEnv = (key) => process.env[key]; -export function setGetEnv(fn: GetEnv, reset = false) { +export function setGetEnv(fn: GetEnv) { _getEnv = fn; - _onSetGetEnv(reset); + _onSetGetEnv(); } let _onSetGetEnv: OnSetGetEnv = () => {}; diff --git a/packages/astro/src/env/vite-plugin-env.ts b/packages/astro/src/env/vite-plugin-env.ts index 816f460b31..c8ec5b8533 100644 --- a/packages/astro/src/env/vite-plugin-env.ts +++ b/packages/astro/src/env/vite-plugin-env.ts @@ -1,6 +1,5 @@ import { readFileSync } from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import { type Plugin, loadEnv } from 'vite'; +import type { Plugin } from 'vite'; import { AstroError, AstroErrorData } from '../core/errors/index.js'; import type { AstroSettings } from '../types/astro.js'; import { @@ -11,26 +10,35 @@ import { import { type InvalidVariable, invalidVariablesToError } from './errors.js'; import type { EnvSchema } from './schema.js'; import { getEnvFieldType, validateEnvVariable } from './validators.js'; +import type { EnvLoader } from './env-loader.js'; interface AstroEnvPluginParams { settings: AstroSettings; mode: string; sync: boolean; + envLoader: EnvLoader; } -export function astroEnv({ settings, mode, sync }: AstroEnvPluginParams): Plugin { +export function astroEnv({ settings, mode, sync, envLoader }: AstroEnvPluginParams): Plugin { const { schema, validateSecrets } = settings.config.env; + let isDev: boolean; let templates: { client: string; server: string; internal: string } | null = null; return { name: 'astro-env-plugin', enforce: 'pre', + config(_, { command }) { + isDev = command !== 'build'; + }, buildStart() { - const loadedEnv = loadEnv(mode, fileURLToPath(settings.config.root), ''); - for (const [key, value] of Object.entries(loadedEnv)) { - if (value !== undefined) { - process.env[key] = value; + const loadedEnv = envLoader.load(mode, settings.config); + + if (!isDev) { + for (const [key, value] of Object.entries(loadedEnv)) { + if (value !== undefined) { + process.env[key] = value; + } } } @@ -42,7 +50,7 @@ export function astroEnv({ settings, mode, sync }: AstroEnvPluginParams): Plugin }); templates = { - ...getTemplates(schema, validatedVariables), + ...getTemplates(schema, validatedVariables, isDev ? loadedEnv : null), internal: `export const schema = ${JSON.stringify(schema)};`, }; }, @@ -122,6 +130,7 @@ function validatePublicVariables({ function getTemplates( schema: EnvSchema, validatedVariables: ReturnType, + loadedEnv: Record | null, ) { let client = ''; let server = readFileSync(MODULE_TEMPLATE_URL, 'utf-8'); @@ -142,10 +151,15 @@ function getTemplates( } server += `export let ${key} = _internalGetSecret(${JSON.stringify(key)});\n`; - onSetGetEnv += `${key} = reset ? undefined : _internalGetSecret(${JSON.stringify(key)});\n`; + onSetGetEnv += `${key} = _internalGetSecret(${JSON.stringify(key)});\n`; } server = server.replace('// @@ON_SET_GET_ENV@@', onSetGetEnv); + if (loadedEnv) { + server = server.replace('// @@GET_ENV@@', `return (${JSON.stringify(loadedEnv)})[key];`); + } else { + server = server.replace('// @@GET_ENV@@', 'return _getEnv(key);'); + } return { client, diff --git a/packages/astro/src/vite-plugin-astro-server/plugin.ts b/packages/astro/src/vite-plugin-astro-server/plugin.ts index 871a123160..b706f967d3 100644 --- a/packages/astro/src/vite-plugin-astro-server/plugin.ts +++ b/packages/astro/src/vite-plugin-astro-server/plugin.ts @@ -191,7 +191,6 @@ export function createDevelopmentManifest(settings: AstroSettings): SSRManifest i18n: i18nManifest, checkOrigin: (settings.config.security?.checkOrigin && settings.buildOutput === 'server') ?? false, - envGetSecretEnabled: false, key: hasEnvironmentKey() ? getEnvironmentKey() : createKey(), middleware() { return { diff --git a/packages/astro/src/vite-plugin-env/index.ts b/packages/astro/src/vite-plugin-env/index.ts index f68012927c..76d295089f 100644 --- a/packages/astro/src/vite-plugin-env/index.ts +++ b/packages/astro/src/vite-plugin-env/index.ts @@ -1,63 +1,14 @@ -import { fileURLToPath } from 'node:url'; import { transform } from 'esbuild'; import MagicString from 'magic-string'; import type * as vite from 'vite'; -import { loadEnv } from 'vite'; -import type { AstroSettings } from '../types/astro.js'; -import type { AstroConfig } from '../types/public/config.js'; +import type { EnvLoader } from '../env/env-loader.js'; interface EnvPluginOptions { - settings: AstroSettings; + envLoader: EnvLoader; } // Match `import.meta.env` directly without trailing property access const importMetaEnvOnlyRe = /\bimport\.meta\.env\b(?!\.)/; -// Match valid JS variable names (identifiers), which accepts most alphanumeric characters, -// except that the first character cannot be a number. -const isValidIdentifierRe = /^[_$a-zA-Z][\w$]*$/; - -function getPrivateEnv( - viteConfig: vite.ResolvedConfig, - astroConfig: AstroConfig, -): Record { - let envPrefixes: string[] = ['PUBLIC_']; - if (viteConfig.envPrefix) { - envPrefixes = Array.isArray(viteConfig.envPrefix) - ? viteConfig.envPrefix - : [viteConfig.envPrefix]; - } - - // Loads environment variables from `.env` files and `process.env` - const fullEnv = loadEnv( - viteConfig.mode, - viteConfig.envDir ?? fileURLToPath(astroConfig.root), - '', - ); - - const privateEnv: Record = {}; - for (const key in fullEnv) { - // Ignore public env var - if (isValidIdentifierRe.test(key) && envPrefixes.every((prefix) => !key.startsWith(prefix))) { - if (typeof process.env[key] !== 'undefined') { - let value = process.env[key]; - // Replacements are always strings, so try to convert to strings here first - if (typeof value !== 'string') { - value = `${value}`; - } - // Boolean values should be inlined to support `export const prerender` - // We already know that these are NOT sensitive values, so inlining is safe - if (value === '0' || value === '1' || value === 'true' || value === 'false') { - privateEnv[key] = value; - } else { - privateEnv[key] = `process.env.${key}`; - } - } else { - privateEnv[key] = JSON.stringify(fullEnv[key]); - } - } - } - return privateEnv; -} function getReferencedPrivateKeys(source: string, privateEnv: Record): Set { const references = new Set(); @@ -114,13 +65,12 @@ async function replaceDefine( }; } -export default function envVitePlugin({ settings }: EnvPluginOptions): vite.Plugin { +export default function envVitePlugin({ envLoader }: EnvPluginOptions): vite.Plugin { let privateEnv: Record; let defaultDefines: Record; let isDev: boolean; let devImportMetaEnvPrepend: string; let viteConfig: vite.ResolvedConfig; - const { config: astroConfig } = settings; return { name: 'astro:vite-plugin-env', config(_, { command }) { @@ -152,7 +102,9 @@ export default function envVitePlugin({ settings }: EnvPluginOptions): vite.Plug } // Find matches for *private* env and do our own replacement. - privateEnv ??= getPrivateEnv(viteConfig, astroConfig); + // Env is retrieved before process.env is populated by astro:env + // so that import.meta.env is first replaced by values, not process.env + privateEnv ??= envLoader.getPrivateEnv(); // In dev, we can assign the private env vars to `import.meta.env` directly for performance if (isDev) { diff --git a/packages/astro/templates/env.mjs b/packages/astro/templates/env.mjs index 4144dde5b7..4461ed035b 100644 --- a/packages/astro/templates/env.mjs +++ b/packages/astro/templates/env.mjs @@ -2,14 +2,23 @@ import { schema } from 'virtual:astro:env/internal'; import { createInvalidVariablesError, - getEnv, + getEnv as _getEnv, getEnvFieldType, setOnSetGetEnv, validateEnvVariable, } from 'astro/env/runtime'; +// @ts-expect-error +/** @returns {string} */ +// used while generating the virtual module +// biome-ignore lint/correctness/noUnusedFunctionParameters: `key` is used by the generated code +// biome-ignore lint/correctness/noUnusedVariables: `key` is used by the generated code +const getEnv = (key) => { + // @@GET_ENV@@ +}; + export const getSecret = (key) => { - return getEnv(key); + return getEnv(key) }; const _internalGetSecret = (key) => { @@ -25,9 +34,6 @@ const _internalGetSecret = (key) => { throw createInvalidVariablesError(key, type, result); }; -// used while generating the virtual module -// biome-ignore lint/correctness/noUnusedFunctionParameters: `reset` is used by the generated code -// biome-ignore lint/correctness/noUnusedVariables: `reset` is used by the generated code -setOnSetGetEnv((reset) => { +setOnSetGetEnv(() => { // @@ON_SET_GET_ENV@@ }); From 2b53588772737fb8cce7e6e44f400a804ea0b65d Mon Sep 17 00:00:00 2001 From: Florian Lefebvre Date: Mon, 9 Dec 2024 12:30:37 +0000 Subject: [PATCH 02/35] [ci] format --- packages/astro/src/core/create-vite.ts | 2 +- packages/astro/src/env/env-loader.ts | 2 +- packages/astro/src/env/vite-plugin-env.ts | 2 +- packages/astro/templates/env.mjs | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/astro/src/core/create-vite.ts b/packages/astro/src/core/create-vite.ts index 784ef5f83f..5d9e77b3d9 100644 --- a/packages/astro/src/core/create-vite.ts +++ b/packages/astro/src/core/create-vite.ts @@ -12,6 +12,7 @@ import { astroContentImportPlugin, astroContentVirtualModPlugin, } from '../content/index.js'; +import { createEnvLoader } from '../env/env-loader.js'; import { astroEnv } from '../env/vite-plugin-env.js'; import astroInternationalization from '../i18n/vite-plugin-i18n.js'; import astroPrefetch from '../prefetch/vite-plugin-prefetch.js'; @@ -41,7 +42,6 @@ import { vitePluginMiddleware } from './middleware/vite-plugin.js'; import { joinPaths } from './path.js'; import { vitePluginServerIslands } from './server-islands/vite-plugin-server-islands.js'; import { isObject } from './util.js'; -import { createEnvLoader } from '../env/env-loader.js'; type CreateViteOptions = { settings: AstroSettings; diff --git a/packages/astro/src/env/env-loader.ts b/packages/astro/src/env/env-loader.ts index f33878a652..d3893c6f90 100644 --- a/packages/astro/src/env/env-loader.ts +++ b/packages/astro/src/env/env-loader.ts @@ -1,6 +1,6 @@ +import { fileURLToPath } from 'node:url'; import { loadEnv } from 'vite'; import type { AstroConfig } from '../types/public/index.js'; -import { fileURLToPath } from 'node:url'; // Match valid JS variable names (identifiers), which accepts most alphanumeric characters, // except that the first character cannot be a number. diff --git a/packages/astro/src/env/vite-plugin-env.ts b/packages/astro/src/env/vite-plugin-env.ts index c8ec5b8533..1d02839243 100644 --- a/packages/astro/src/env/vite-plugin-env.ts +++ b/packages/astro/src/env/vite-plugin-env.ts @@ -7,10 +7,10 @@ import { VIRTUAL_MODULES_IDS, VIRTUAL_MODULES_IDS_VALUES, } from './constants.js'; +import type { EnvLoader } from './env-loader.js'; import { type InvalidVariable, invalidVariablesToError } from './errors.js'; import type { EnvSchema } from './schema.js'; import { getEnvFieldType, validateEnvVariable } from './validators.js'; -import type { EnvLoader } from './env-loader.js'; interface AstroEnvPluginParams { settings: AstroSettings; diff --git a/packages/astro/templates/env.mjs b/packages/astro/templates/env.mjs index 4461ed035b..9f36f1175b 100644 --- a/packages/astro/templates/env.mjs +++ b/packages/astro/templates/env.mjs @@ -1,8 +1,8 @@ // @ts-check import { schema } from 'virtual:astro:env/internal'; import { - createInvalidVariablesError, getEnv as _getEnv, + createInvalidVariablesError, getEnvFieldType, setOnSetGetEnv, validateEnvVariable, @@ -18,7 +18,7 @@ const getEnv = (key) => { }; export const getSecret = (key) => { - return getEnv(key) + return getEnv(key); }; const _internalGetSecret = (key) => { From a203d5dd582166674c45e807a5dc9113e26e24f0 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Mon, 9 Dec 2024 15:10:17 +0000 Subject: [PATCH 03/35] fix: catch image errors correctly (#12695) --- .changeset/nine-experts-tan.md | 5 +++++ packages/astro/src/content/vite-plugin-content-assets.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/nine-experts-tan.md diff --git a/.changeset/nine-experts-tan.md b/.changeset/nine-experts-tan.md new file mode 100644 index 0000000000..86c8523442 --- /dev/null +++ b/.changeset/nine-experts-tan.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Throws a more helpful error when images are missing diff --git a/packages/astro/src/content/vite-plugin-content-assets.ts b/packages/astro/src/content/vite-plugin-content-assets.ts index f4b8ed98ec..33084d6e39 100644 --- a/packages/astro/src/content/vite-plugin-content-assets.ts +++ b/packages/astro/src/content/vite-plugin-content-assets.ts @@ -39,7 +39,7 @@ export function astroContentAssetPropagationPlugin({ ? fileURLToPath(new URL(importerParam, settings.config.root)) : importer; - const resolved = this.resolve(base, importerPath, { skipSelf: true, ...opts }); + const resolved = await this.resolve(base, importerPath, { skipSelf: true, ...opts }); if (!resolved) { throw new AstroError({ ...AstroErrorData.ImageNotFound, From 163cfd67f5c0faa2cfcbad932e61e25a1bffe0ee Mon Sep 17 00:00:00 2001 From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com> Date: Mon, 9 Dec 2024 07:38:09 -0800 Subject: [PATCH 04/35] [ci] release (#12650) Co-authored-by: github-actions[bot] --- .changeset/bright-gifts-prove.md | 5 -- .changeset/nasty-parrots-cry.md | 5 -- .changeset/nine-experts-tan.md | 5 -- .changeset/ten-moons-brake.md | 5 -- .changeset/twelve-pens-remain.md | 5 -- .changeset/unlucky-wasps-refuse.md | 5 -- examples/basics/package.json | 2 +- examples/blog/package.json | 4 +- examples/component/package.json | 2 +- examples/container-with-vitest/package.json | 2 +- examples/framework-alpine/package.json | 2 +- examples/framework-multiple/package.json | 2 +- examples/framework-preact/package.json | 2 +- examples/framework-react/package.json | 2 +- examples/framework-solid/package.json | 2 +- examples/framework-svelte/package.json | 2 +- examples/framework-vue/package.json | 2 +- examples/hackernews/package.json | 2 +- examples/integration/package.json | 2 +- examples/minimal/package.json | 2 +- examples/portfolio/package.json | 2 +- examples/ssr/package.json | 2 +- examples/starlog/package.json | 2 +- examples/toolbar-app/package.json | 2 +- examples/with-markdoc/package.json | 4 +- examples/with-mdx/package.json | 4 +- examples/with-nanostores/package.json | 2 +- examples/with-tailwindcss/package.json | 4 +- examples/with-vitest/package.json | 2 +- packages/astro/CHANGELOG.md | 13 +++++ packages/astro/package.json | 2 +- packages/integrations/markdoc/CHANGELOG.md | 7 +++ packages/integrations/markdoc/package.json | 2 +- packages/integrations/mdx/CHANGELOG.md | 7 +++ packages/integrations/mdx/package.json | 2 +- packages/markdown/remark/CHANGELOG.md | 10 ++++ packages/markdown/remark/package.json | 2 +- pnpm-lock.yaml | 54 ++++++++++----------- 38 files changed, 95 insertions(+), 88 deletions(-) delete mode 100644 .changeset/bright-gifts-prove.md delete mode 100644 .changeset/nasty-parrots-cry.md delete mode 100644 .changeset/nine-experts-tan.md delete mode 100644 .changeset/ten-moons-brake.md delete mode 100644 .changeset/twelve-pens-remain.md delete mode 100644 .changeset/unlucky-wasps-refuse.md diff --git a/.changeset/bright-gifts-prove.md b/.changeset/bright-gifts-prove.md deleted file mode 100644 index 14b1a3bde1..0000000000 --- a/.changeset/bright-gifts-prove.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"astro": patch ---- - -Updates a reference in an error message diff --git a/.changeset/nasty-parrots-cry.md b/.changeset/nasty-parrots-cry.md deleted file mode 100644 index be25a64c2a..0000000000 --- a/.changeset/nasty-parrots-cry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'astro': patch ---- - -Fixes a case where `process.env` would be frozen despite changes made to environment variables in development \ No newline at end of file diff --git a/.changeset/nine-experts-tan.md b/.changeset/nine-experts-tan.md deleted file mode 100644 index 86c8523442..0000000000 --- a/.changeset/nine-experts-tan.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'astro': patch ---- - -Throws a more helpful error when images are missing diff --git a/.changeset/ten-moons-brake.md b/.changeset/ten-moons-brake.md deleted file mode 100644 index f034e1319e..0000000000 --- a/.changeset/ten-moons-brake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@astrojs/markdown-remark': patch ---- - -Avoids parsing frontmatter that are not at the top of a file diff --git a/.changeset/twelve-pens-remain.md b/.changeset/twelve-pens-remain.md deleted file mode 100644 index 46023ea725..0000000000 --- a/.changeset/twelve-pens-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@astrojs/markdown-remark": patch ---- - -Removes trailing new line in code blocks to prevent generating a trailing empty `` tag diff --git a/.changeset/unlucky-wasps-refuse.md b/.changeset/unlucky-wasps-refuse.md deleted file mode 100644 index 5e0d4d664b..0000000000 --- a/.changeset/unlucky-wasps-refuse.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@astrojs/markdown-remark': patch ---- - -Fixes frontmatter parsing if file is encoded in UTF8 with BOM diff --git a/examples/basics/package.json b/examples/basics/package.json index 695d42eb5b..405176a207 100644 --- a/examples/basics/package.json +++ b/examples/basics/package.json @@ -10,6 +10,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^5.0.3" + "astro": "^5.0.4" } } diff --git a/examples/blog/package.json b/examples/blog/package.json index c2ab4c69fe..bee6d8b2e0 100644 --- a/examples/blog/package.json +++ b/examples/blog/package.json @@ -10,9 +10,9 @@ "astro": "astro" }, "dependencies": { - "@astrojs/mdx": "^4.0.1", + "@astrojs/mdx": "^4.0.2", "@astrojs/rss": "^4.0.10", "@astrojs/sitemap": "^3.2.1", - "astro": "^5.0.3" + "astro": "^5.0.4" } } diff --git a/examples/component/package.json b/examples/component/package.json index e3cce0dc38..9c4252bca6 100644 --- a/examples/component/package.json +++ b/examples/component/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^5.0.3" + "astro": "^5.0.4" }, "peerDependencies": { "astro": "^4.0.0 || ^5.0.0" diff --git a/examples/container-with-vitest/package.json b/examples/container-with-vitest/package.json index a4f5269843..b202ff1f26 100644 --- a/examples/container-with-vitest/package.json +++ b/examples/container-with-vitest/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@astrojs/react": "^4.0.0", - "astro": "^5.0.3", + "astro": "^5.0.4", "react": "^18.3.1", "react-dom": "^18.3.1", "vitest": "^2.1.6" diff --git a/examples/framework-alpine/package.json b/examples/framework-alpine/package.json index 6c31cc904e..9970749bd5 100644 --- a/examples/framework-alpine/package.json +++ b/examples/framework-alpine/package.json @@ -13,6 +13,6 @@ "@astrojs/alpinejs": "^0.4.0", "@types/alpinejs": "^3.13.10", "alpinejs": "^3.14.3", - "astro": "^5.0.3" + "astro": "^5.0.4" } } diff --git a/examples/framework-multiple/package.json b/examples/framework-multiple/package.json index d3cb9171a9..cc1a53493c 100644 --- a/examples/framework-multiple/package.json +++ b/examples/framework-multiple/package.json @@ -17,7 +17,7 @@ "@astrojs/vue": "^5.0.1", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", - "astro": "^5.0.3", + "astro": "^5.0.4", "preact": "^10.24.3", "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/examples/framework-preact/package.json b/examples/framework-preact/package.json index 3610e1af71..952656d3cc 100644 --- a/examples/framework-preact/package.json +++ b/examples/framework-preact/package.json @@ -12,7 +12,7 @@ "dependencies": { "@astrojs/preact": "^4.0.0", "@preact/signals": "^1.3.0", - "astro": "^5.0.3", + "astro": "^5.0.4", "preact": "^10.24.3" } } diff --git a/examples/framework-react/package.json b/examples/framework-react/package.json index d651a384e7..3f666d4c1b 100644 --- a/examples/framework-react/package.json +++ b/examples/framework-react/package.json @@ -13,7 +13,7 @@ "@astrojs/react": "^4.0.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", - "astro": "^5.0.3", + "astro": "^5.0.4", "react": "^18.3.1", "react-dom": "^18.3.1" } diff --git a/examples/framework-solid/package.json b/examples/framework-solid/package.json index 57a2765467..018099983f 100644 --- a/examples/framework-solid/package.json +++ b/examples/framework-solid/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@astrojs/solid-js": "^5.0.0", - "astro": "^5.0.3", + "astro": "^5.0.4", "solid-js": "^1.9.3" } } diff --git a/examples/framework-svelte/package.json b/examples/framework-svelte/package.json index 01bc92cbe4..6ccaa6dbc7 100644 --- a/examples/framework-svelte/package.json +++ b/examples/framework-svelte/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@astrojs/svelte": "^7.0.1", - "astro": "^5.0.3", + "astro": "^5.0.4", "svelte": "^5.1.16" } } diff --git a/examples/framework-vue/package.json b/examples/framework-vue/package.json index af66cba4fd..fe56cf7eff 100644 --- a/examples/framework-vue/package.json +++ b/examples/framework-vue/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@astrojs/vue": "^5.0.1", - "astro": "^5.0.3", + "astro": "^5.0.4", "vue": "^3.5.12" } } diff --git a/examples/hackernews/package.json b/examples/hackernews/package.json index c791dddbe3..f2f624df70 100644 --- a/examples/hackernews/package.json +++ b/examples/hackernews/package.json @@ -11,6 +11,6 @@ }, "dependencies": { "@astrojs/node": "^9.0.0", - "astro": "^5.0.3" + "astro": "^5.0.4" } } diff --git a/examples/integration/package.json b/examples/integration/package.json index afc2de354f..41da0a86c2 100644 --- a/examples/integration/package.json +++ b/examples/integration/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^5.0.3" + "astro": "^5.0.4" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/minimal/package.json b/examples/minimal/package.json index c913c48e46..1a58ed5178 100644 --- a/examples/minimal/package.json +++ b/examples/minimal/package.json @@ -10,6 +10,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^5.0.3" + "astro": "^5.0.4" } } diff --git a/examples/portfolio/package.json b/examples/portfolio/package.json index 881563abb2..4a8e47a67a 100644 --- a/examples/portfolio/package.json +++ b/examples/portfolio/package.json @@ -10,6 +10,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^5.0.3" + "astro": "^5.0.4" } } diff --git a/examples/ssr/package.json b/examples/ssr/package.json index 25144d1c55..72b6d1b192 100644 --- a/examples/ssr/package.json +++ b/examples/ssr/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/node": "^9.0.0", "@astrojs/svelte": "^7.0.1", - "astro": "^5.0.3", + "astro": "^5.0.4", "svelte": "^5.1.16" } } diff --git a/examples/starlog/package.json b/examples/starlog/package.json index e779f51947..209c54c199 100644 --- a/examples/starlog/package.json +++ b/examples/starlog/package.json @@ -9,7 +9,7 @@ "astro": "astro" }, "dependencies": { - "astro": "^5.0.3", + "astro": "^5.0.4", "sass": "^1.80.6", "sharp": "^0.33.3" } diff --git a/examples/toolbar-app/package.json b/examples/toolbar-app/package.json index 8abafa93b2..e137aea638 100644 --- a/examples/toolbar-app/package.json +++ b/examples/toolbar-app/package.json @@ -15,6 +15,6 @@ "./app": "./dist/app.js" }, "devDependencies": { - "astro": "^5.0.3" + "astro": "^5.0.4" } } diff --git a/examples/with-markdoc/package.json b/examples/with-markdoc/package.json index af6d7c310e..111e1486aa 100644 --- a/examples/with-markdoc/package.json +++ b/examples/with-markdoc/package.json @@ -10,7 +10,7 @@ "astro": "astro" }, "dependencies": { - "@astrojs/markdoc": "^0.12.1", - "astro": "^5.0.3" + "@astrojs/markdoc": "^0.12.2", + "astro": "^5.0.4" } } diff --git a/examples/with-mdx/package.json b/examples/with-mdx/package.json index 1c01fb9900..26c8dbb914 100644 --- a/examples/with-mdx/package.json +++ b/examples/with-mdx/package.json @@ -10,9 +10,9 @@ "astro": "astro" }, "dependencies": { - "@astrojs/mdx": "^4.0.1", + "@astrojs/mdx": "^4.0.2", "@astrojs/preact": "^4.0.0", - "astro": "^5.0.3", + "astro": "^5.0.4", "preact": "^10.24.3" } } diff --git a/examples/with-nanostores/package.json b/examples/with-nanostores/package.json index 79e7f87578..dea7ea20ee 100644 --- a/examples/with-nanostores/package.json +++ b/examples/with-nanostores/package.json @@ -12,7 +12,7 @@ "dependencies": { "@astrojs/preact": "^4.0.0", "@nanostores/preact": "^0.5.2", - "astro": "^5.0.3", + "astro": "^5.0.4", "nanostores": "^0.11.3", "preact": "^10.24.3" } diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json index 49ca8f2117..2d8b72824b 100644 --- a/examples/with-tailwindcss/package.json +++ b/examples/with-tailwindcss/package.json @@ -10,10 +10,10 @@ "astro": "astro" }, "dependencies": { - "@astrojs/mdx": "^4.0.1", + "@astrojs/mdx": "^4.0.2", "@astrojs/tailwind": "^5.1.3", "@types/canvas-confetti": "^1.6.4", - "astro": "^5.0.3", + "astro": "^5.0.4", "autoprefixer": "^10.4.20", "canvas-confetti": "^1.9.3", "postcss": "^8.4.49", diff --git a/examples/with-vitest/package.json b/examples/with-vitest/package.json index f1204bfb54..7896c5f74e 100644 --- a/examples/with-vitest/package.json +++ b/examples/with-vitest/package.json @@ -11,7 +11,7 @@ "test": "vitest" }, "dependencies": { - "astro": "^5.0.3", + "astro": "^5.0.4", "vitest": "^2.1.6" } } diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 3c227b94c2..5bcd4ccae0 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,18 @@ # astro +## 5.0.4 + +### Patch Changes + +- [#12653](https://github.com/withastro/astro/pull/12653) [`e21c7e6`](https://github.com/withastro/astro/commit/e21c7e67fde1155cf593fd2b40010c5e2c2cd3f2) Thanks [@sarah11918](https://github.com/sarah11918)! - Updates a reference in an error message + +- [#12585](https://github.com/withastro/astro/pull/12585) [`a9373c0`](https://github.com/withastro/astro/commit/a9373c0c9a3c2e1773fc11bb14e156698b0d9d38) Thanks [@florian-lefebvre](https://github.com/florian-lefebvre)! - Fixes a case where `process.env` would be frozen despite changes made to environment variables in development + +- [#12695](https://github.com/withastro/astro/pull/12695) [`a203d5d`](https://github.com/withastro/astro/commit/a203d5dd582166674c45e807a5dc9113e26e24f0) Thanks [@ascorbic](https://github.com/ascorbic)! - Throws a more helpful error when images are missing + +- Updated dependencies [[`f13417b`](https://github.com/withastro/astro/commit/f13417bfbf73130c224752379e2da33084f89554), [`87231b1`](https://github.com/withastro/astro/commit/87231b1168da66bb593f681206c42fa555dfcabc), [`a71e9b9`](https://github.com/withastro/astro/commit/a71e9b93b317edc0ded49d4d50f1b7841c8cd428)]: + - @astrojs/markdown-remark@6.0.1 + ## 5.0.3 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index 3ee650bb3e..c588c592df 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "astro", - "version": "5.0.3", + "version": "5.0.4", "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.", "type": "module", "author": "withastro", diff --git a/packages/integrations/markdoc/CHANGELOG.md b/packages/integrations/markdoc/CHANGELOG.md index 3f192ca7de..f85601a9a7 100644 --- a/packages/integrations/markdoc/CHANGELOG.md +++ b/packages/integrations/markdoc/CHANGELOG.md @@ -1,5 +1,12 @@ # @astrojs/markdoc +## 0.12.2 + +### Patch Changes + +- Updated dependencies [[`f13417b`](https://github.com/withastro/astro/commit/f13417bfbf73130c224752379e2da33084f89554), [`87231b1`](https://github.com/withastro/astro/commit/87231b1168da66bb593f681206c42fa555dfcabc), [`a71e9b9`](https://github.com/withastro/astro/commit/a71e9b93b317edc0ded49d4d50f1b7841c8cd428)]: + - @astrojs/markdown-remark@6.0.1 + ## 0.12.1 ### Patch Changes diff --git a/packages/integrations/markdoc/package.json b/packages/integrations/markdoc/package.json index 09238b177e..4c9c26967c 100644 --- a/packages/integrations/markdoc/package.json +++ b/packages/integrations/markdoc/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/markdoc", "description": "Add support for Markdoc in your Astro site", - "version": "0.12.1", + "version": "0.12.2", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/packages/integrations/mdx/CHANGELOG.md b/packages/integrations/mdx/CHANGELOG.md index e60a7008e3..d6cd10fea1 100644 --- a/packages/integrations/mdx/CHANGELOG.md +++ b/packages/integrations/mdx/CHANGELOG.md @@ -1,5 +1,12 @@ # @astrojs/mdx +## 4.0.2 + +### Patch Changes + +- Updated dependencies [[`f13417b`](https://github.com/withastro/astro/commit/f13417bfbf73130c224752379e2da33084f89554), [`87231b1`](https://github.com/withastro/astro/commit/87231b1168da66bb593f681206c42fa555dfcabc), [`a71e9b9`](https://github.com/withastro/astro/commit/a71e9b93b317edc0ded49d4d50f1b7841c8cd428)]: + - @astrojs/markdown-remark@6.0.1 + ## 4.0.1 ### Patch Changes diff --git a/packages/integrations/mdx/package.json b/packages/integrations/mdx/package.json index 0a59585185..3979b3caed 100644 --- a/packages/integrations/mdx/package.json +++ b/packages/integrations/mdx/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/mdx", "description": "Add support for MDX pages in your Astro site", - "version": "4.0.1", + "version": "4.0.2", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/packages/markdown/remark/CHANGELOG.md b/packages/markdown/remark/CHANGELOG.md index 683600f29c..f30f484298 100644 --- a/packages/markdown/remark/CHANGELOG.md +++ b/packages/markdown/remark/CHANGELOG.md @@ -1,5 +1,15 @@ # @astrojs/markdown-remark +## 6.0.1 + +### Patch Changes + +- [#12646](https://github.com/withastro/astro/pull/12646) [`f13417b`](https://github.com/withastro/astro/commit/f13417bfbf73130c224752379e2da33084f89554) Thanks [@bluwy](https://github.com/bluwy)! - Avoids parsing frontmatter that are not at the top of a file + +- [#12570](https://github.com/withastro/astro/pull/12570) [`87231b1`](https://github.com/withastro/astro/commit/87231b1168da66bb593f681206c42fa555dfcabc) Thanks [@GrimLink](https://github.com/GrimLink)! - Removes trailing new line in code blocks to prevent generating a trailing empty `` tag + +- [#12664](https://github.com/withastro/astro/pull/12664) [`a71e9b9`](https://github.com/withastro/astro/commit/a71e9b93b317edc0ded49d4d50f1b7841c8cd428) Thanks [@bluwy](https://github.com/bluwy)! - Fixes frontmatter parsing if file is encoded in UTF8 with BOM + ## 6.0.0 ### Major Changes diff --git a/packages/markdown/remark/package.json b/packages/markdown/remark/package.json index a9c7f03be4..2d133873b5 100644 --- a/packages/markdown/remark/package.json +++ b/packages/markdown/remark/package.json @@ -1,6 +1,6 @@ { "name": "@astrojs/markdown-remark", - "version": "6.0.0", + "version": "6.0.1", "type": "module", "author": "withastro", "license": "MIT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd97f9e318..de39f0116c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -142,13 +142,13 @@ importers: examples/basics: dependencies: astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro examples/blog: dependencies: '@astrojs/mdx': - specifier: ^4.0.1 + specifier: ^4.0.2 version: link:../../packages/integrations/mdx '@astrojs/rss': specifier: ^4.0.10 @@ -157,13 +157,13 @@ importers: specifier: ^3.2.1 version: link:../../packages/integrations/sitemap astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro examples/component: devDependencies: astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro examples/container-with-vitest: @@ -172,7 +172,7 @@ importers: specifier: ^4.0.0 version: link:../../packages/integrations/react astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro react: specifier: ^18.3.1 @@ -203,7 +203,7 @@ importers: specifier: ^3.14.3 version: 3.14.3 astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro examples/framework-multiple: @@ -230,7 +230,7 @@ importers: specifier: ^18.3.1 version: 18.3.1 astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro preact: specifier: ^10.24.3 @@ -260,7 +260,7 @@ importers: specifier: ^1.3.0 version: 1.3.0(preact@10.24.3) astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro preact: specifier: ^10.24.3 @@ -278,7 +278,7 @@ importers: specifier: ^18.3.1 version: 18.3.1 astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro react: specifier: ^18.3.1 @@ -293,7 +293,7 @@ importers: specifier: ^5.0.0 version: link:../../packages/integrations/solid astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro solid-js: specifier: ^1.9.3 @@ -305,7 +305,7 @@ importers: specifier: ^7.0.1 version: link:../../packages/integrations/svelte astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro svelte: specifier: ^5.1.16 @@ -317,7 +317,7 @@ importers: specifier: ^5.0.1 version: link:../../packages/integrations/vue astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro vue: specifier: ^3.5.12 @@ -329,25 +329,25 @@ importers: specifier: ^9.0.0 version: 9.0.0(astro@packages+astro) astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro examples/integration: devDependencies: astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro examples/minimal: dependencies: astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro examples/portfolio: dependencies: astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro examples/ssr: @@ -359,7 +359,7 @@ importers: specifier: ^7.0.1 version: link:../../packages/integrations/svelte astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro svelte: specifier: ^5.1.16 @@ -368,7 +368,7 @@ importers: examples/starlog: dependencies: astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro sass: specifier: ^1.80.6 @@ -380,28 +380,28 @@ importers: examples/toolbar-app: devDependencies: astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro examples/with-markdoc: dependencies: '@astrojs/markdoc': - specifier: ^0.12.1 + specifier: ^0.12.2 version: link:../../packages/integrations/markdoc astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro examples/with-mdx: dependencies: '@astrojs/mdx': - specifier: ^4.0.1 + specifier: ^4.0.2 version: link:../../packages/integrations/mdx '@astrojs/preact': specifier: ^4.0.0 version: link:../../packages/integrations/preact astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro preact: specifier: ^10.24.3 @@ -416,7 +416,7 @@ importers: specifier: ^0.5.2 version: 0.5.2(nanostores@0.11.3)(preact@10.24.3) astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro nanostores: specifier: ^0.11.3 @@ -428,7 +428,7 @@ importers: examples/with-tailwindcss: dependencies: '@astrojs/mdx': - specifier: ^4.0.1 + specifier: ^4.0.2 version: link:../../packages/integrations/mdx '@astrojs/tailwind': specifier: ^5.1.3 @@ -437,7 +437,7 @@ importers: specifier: ^1.6.4 version: 1.6.4 astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro autoprefixer: specifier: ^10.4.20 @@ -455,7 +455,7 @@ importers: examples/with-vitest: dependencies: astro: - specifier: ^5.0.3 + specifier: ^5.0.4 version: link:../../packages/astro vitest: specifier: ^2.1.6 From 1c4a032247747c830be94dbdd0c953511a6bfa53 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Mon, 9 Dec 2024 15:54:33 +0000 Subject: [PATCH 05/35] fix: escape image filenames (#12697) --- .changeset/famous-teachers-hug.md | 5 +++++ .../astro/src/content/mutable-data-store.ts | 2 +- .../fixtures/content-layer/images/I'm back.jpg | Bin 0 -> 57598 bytes .../src/content/space/endeavour.md | 2 ++ 4 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .changeset/famous-teachers-hug.md create mode 100644 packages/astro/test/fixtures/content-layer/images/I'm back.jpg diff --git a/.changeset/famous-teachers-hug.md b/.changeset/famous-teachers-hug.md new file mode 100644 index 0000000000..988f2993f9 --- /dev/null +++ b/.changeset/famous-teachers-hug.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fix a bug that caused builds to fail if an image had a quote mark in its name diff --git a/packages/astro/src/content/mutable-data-store.ts b/packages/astro/src/content/mutable-data-store.ts index 18a7662ee6..9587b30596 100644 --- a/packages/astro/src/content/mutable-data-store.ts +++ b/packages/astro/src/content/mutable-data-store.ts @@ -102,7 +102,7 @@ export class MutableDataStore extends ImmutableDataStore { const exports: Array = []; this.#assetImports.forEach((id) => { const symbol = importIdToSymbolName(id); - imports.push(`import ${symbol} from '${id}';`); + imports.push(`import ${symbol} from ${JSON.stringify(id)};`); exports.push(`[${JSON.stringify(id)}, ${symbol}]`); }); const code = /* js */ ` diff --git a/packages/astro/test/fixtures/content-layer/images/I'm back.jpg b/packages/astro/test/fixtures/content-layer/images/I'm back.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7455a726ef135d1a11e58b219659cb9a5ddb4e39 GIT binary patch literal 57598 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/packages/astro/test/fixtures/content-layer/src/content/space/endeavour.md b/packages/astro/test/fixtures/content-layer/src/content/space/endeavour.md index 51d6e8c421..43dfd97a1f 100644 --- a/packages/astro/test/fixtures/content-layer/src/content/space/endeavour.md +++ b/packages/astro/test/fixtures/content-layer/src/content/space/endeavour.md @@ -3,6 +3,8 @@ title: Endeavour description: 'Learn about the Endeavour NASA space shuttle.' publishedDate: 'Sun Jul 11 2021 00:00:00 GMT-0400 (Eastern Daylight Time)' tags: [space, 90s] +heroImage: "@images/I'm back.jpg" + --- **Source:** [Wikipedia](https://en.wikipedia.org/wiki/Space_Shuttle_Endeavour) From 7dc2fca2eeb646bf3fd362d21c5bbfe273838b5a Mon Sep 17 00:00:00 2001 From: Amumu Date: Tue, 10 Dec 2024 16:37:56 +0800 Subject: [PATCH 06/35] chore: fix vite peer dependency issue for vue integration (#12688) * chore: fix peer dependency issue for vue integration * add changesets --- .changeset/green-coins-tie.md | 5 + packages/integrations/vue/package.json | 4 +- pnpm-lock.yaml | 326 ++++++++++++++++++++----- 3 files changed, 276 insertions(+), 59 deletions(-) create mode 100644 .changeset/green-coins-tie.md diff --git a/.changeset/green-coins-tie.md b/.changeset/green-coins-tie.md new file mode 100644 index 0000000000..349bf67244 --- /dev/null +++ b/.changeset/green-coins-tie.md @@ -0,0 +1,5 @@ +--- +'@astrojs/vue': patch +--- + +fix vite peer dependency issue for vue integration diff --git a/packages/integrations/vue/package.json b/packages/integrations/vue/package.json index 3961939046..8e9c5d86d1 100644 --- a/packages/integrations/vue/package.json +++ b/packages/integrations/vue/package.json @@ -43,10 +43,10 @@ }, "dependencies": { "@vitejs/plugin-vue": "^5.2.1", - "@vitejs/plugin-vue-jsx": "^4.0.1", + "@vitejs/plugin-vue-jsx": "^4.1.1", "@vue/compiler-sfc": "^3.5.12", "vite": "^6.0.1", - "vite-plugin-vue-devtools": "^7.6.3" + "vite-plugin-vue-devtools": "^7.6.7" }, "devDependencies": { "astro": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index de39f0116c..0270d490a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5200,8 +5200,8 @@ importers: specifier: ^5.2.1 version: 5.2.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) '@vitejs/plugin-vue-jsx': - specifier: ^4.0.1 - version: 4.0.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) + specifier: ^4.1.1 + version: 4.1.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) '@vue/compiler-sfc': specifier: ^3.5.12 version: 3.5.12 @@ -5209,8 +5209,8 @@ importers: specifier: ^6.0.1 version: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) vite-plugin-vue-devtools: - specifier: ^7.6.3 - version: 7.6.4(rollup@4.27.4)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) + specifier: ^7.6.7 + version: 7.6.7(rollup@4.27.4)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) devDependencies: astro: specifier: workspace:* @@ -5675,10 +5675,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-member-expression-to-functions@7.24.8': resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.18.6': resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} @@ -5697,6 +5707,10 @@ packages: resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.25.9': resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} @@ -5707,10 +5721,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@7.25.9': + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} engines: {node: '>=6.9.0'} + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} @@ -5767,6 +5791,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-development@7.25.9': resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} engines: {node: '>=6.9.0'} @@ -5797,6 +5827,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.26.3': + resolution: {integrity: sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.25.6': resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} engines: {node: '>=6.9.0'} @@ -5835,24 +5871,28 @@ packages: engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [musl] '@biomejs/cli-linux-arm64@1.9.3': resolution: {integrity: sha512-vJkAimD2+sVviNTbaWOGqEBy31cW0ZB52KtpVIbkuma7PlfII3tsLhFa+cwbRAcRBkobBBhqZ06hXoZAN8NODQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [glibc] '@biomejs/cli-linux-x64-musl@1.9.3': resolution: {integrity: sha512-TJmnOG2+NOGM72mlczEsNki9UT+XAsMFAOo8J0me/N47EJ/vkLXxf481evfHLlxMejTY6IN8SdRSiPVLv6AHlA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [musl] '@biomejs/cli-linux-x64@1.9.3': resolution: {integrity: sha512-x220V4c+romd26Mu1ptU+EudMXVS4xmzKxPVb9mgnfYlN4Yx9vD5NZraSx/onJnd3Gh/y8iPUdU5CDZJKg9COA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [glibc] '@biomejs/cli-win32-arm64@1.9.3': resolution: {integrity: sha512-lg/yZis2HdQGsycUvHWSzo9kOvnGgvtrYRgoCEwPBwwAL8/6crOp3+f47tPwI/LI1dZrhSji7PNsGKGHbwyAhw==} @@ -6604,72 +6644,84 @@ packages: engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.2': resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.2': resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.2': resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.2': resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.2': resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.33.3': resolution: {integrity: sha512-Zf+sF1jHZJKA6Gor9hoYG2ljr4wo9cY4twaxgFDvlG0Xz9V7sinsPp8pFd1XtlhTzYo0IhDbl3rK7P6MzHpnYA==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.33.3': resolution: {integrity: sha512-Q7Ee3fFSC9P7vUSqVEF0zccJsZ8GiiCJYGWDdhEjdlOeS9/jdkyJ6sUSPj+bL8VuOYFSbofrW0t/86ceVhx32w==} engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.33.3': resolution: {integrity: sha512-vFk441DKRFepjhTEH20oBlFrHcLjPfI8B0pMIxGm3+yilKyYeHEVvrZhYFdqIseSclIqbQ3SnZMwEMWonY5XFA==} engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.33.3': resolution: {integrity: sha512-Q4I++herIJxJi+qmbySd072oDPRkCg/SClLEIDh5IL9h1zjhqjv82H0Seupd+q2m0yOfD+/fJnjSoDFtKiHu2g==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.3': resolution: {integrity: sha512-qnDccehRDXadhM9PM5hLvcPRYqyFCBN31kq+ErBSZtZlsAc1U4Z85xf/RXv1qolkdu+ibw64fUDaRdktxTNP9A==} engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.33.3': resolution: {integrity: sha512-Jhchim8kHWIU/GZ+9poHMWRcefeaxFIs9EBqf9KtcC14Ojk6qua7ghKiPs0sbeLbLj/2IGBtDcxHyjCdYWkk2w==} engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.33.3': resolution: {integrity: sha512-68zivsdJ0koE96stdUfM+gmyaK/NcoSZK5dV5CAjES0FUXS9lchYt8LAB5rTbM7nlWtxaU/2GON0HVN6/ZYJAQ==} @@ -6846,30 +6898,35 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-glibc@2.4.1': resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.4.1': resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.4.1': resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.4.1': resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-win32-arm64@2.4.1': resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} @@ -6983,46 +7040,55 @@ packages: resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.27.4': resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.27.4': resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.27.4': resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.27.4': resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.27.4': resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.27.4': resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.27.4': resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.27.4': resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} @@ -7039,6 +7105,9 @@ packages: cpu: [x64] os: [win32] + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@shikijs/core@1.23.1': resolution: {integrity: sha512-NuOVgwcHgVC6jBVH5V7iblziw6iQbWWHrj5IlZI3Fqu2yx9awH7OIQkXIcsHsUmY19ckwSgUMgrqExEyP5A0TA==} @@ -7058,6 +7127,10 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@solidjs/router@0.15.1': resolution: {integrity: sha512-lb5BRBqQqii/1dQCglx2K68xLkgu7QcrcajWKuuEx6FHTsK/hp5IgVhjy6RzPMLj+SFyrrRi/ldirCFNxtzh0Q==} peerDependencies: @@ -7324,11 +7397,11 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - '@vitejs/plugin-vue-jsx@4.0.1': - resolution: {integrity: sha512-7mg9HFGnFHMEwCdB6AY83cVK4A6sCqnrjFYF4WIlebYAQVVJ/sC/CiTruVdrRlhrFoeZ8rlMxY9wYpPTIRhhAg==} + '@vitejs/plugin-vue-jsx@4.1.1': + resolution: {integrity: sha512-uMJqv/7u1zz/9NbWAD3XdjaY20tKTf17XVfQ9zq4wY1BjsB/PjpJPMe2xiG39QpP4ZdhYNhm4Hvo66uJrykNLA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - vite: ^5.0.0 + vite: ^5.0.0 || ^6.0.0 vue: ^3.0.0 '@vitejs/plugin-vue@5.2.1': @@ -7462,16 +7535,16 @@ packages: '@vue/compiler-ssr@3.5.13': resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} - '@vue/devtools-core@7.6.4': - resolution: {integrity: sha512-blSwGVYpb7b5TALMjjoBiAl5imuBF7WEOAtaJaBMNikR8SQkm6mkUt4YlIKh9874/qoimwmpDOm+GHBZ4Y5m+g==} + '@vue/devtools-core@7.6.7': + resolution: {integrity: sha512-6fW8Q0H1NHDXdEcuV6dylT5U2Yxg3SdMnVCey99Y6S4R2PNgFL2vC+VU9U9rHIiaoEUkeza42S7FfHxV4VI3Jg==} peerDependencies: vue: ^3.0.0 - '@vue/devtools-kit@7.6.4': - resolution: {integrity: sha512-Zs86qIXXM9icU0PiGY09PQCle4TI750IPLmAJzW5Kf9n9t5HzSYf6Rz6fyzSwmfMPiR51SUKJh9sXVZu78h2QA==} + '@vue/devtools-kit@7.6.7': + resolution: {integrity: sha512-V8/jrXY/swHgnblABG9U4QCbE60c6RuPasmv2d9FvVqc5d94t1vDiESuvRmdNJBdWz4/D3q6ffgyAfRVjwHYEw==} - '@vue/devtools-shared@7.6.4': - resolution: {integrity: sha512-nD6CUvBEel+y7zpyorjiUocy0nh77DThZJ0k1GRnJeOmY3ATq2fWijEp7wk37gb023Cb0R396uYh5qMSBQ5WFg==} + '@vue/devtools-shared@7.6.7': + resolution: {integrity: sha512-QggO6SviAsolrePAXZ/sA1dSicSPt4TueZibCvydfhNDieL1lAuyMTgQDGst7TEvMGb4vgYv2I+1sDkO4jWNnw==} '@vue/reactivity@3.1.5': resolution: {integrity: sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==} @@ -8390,6 +8463,10 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + execa@9.5.2: + resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} + engines: {node: ^18.19.0 || >=20.5.0} + expect-type@1.1.0: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} @@ -8435,6 +8512,10 @@ packages: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -8557,6 +8638,10 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -8723,6 +8808,10 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + human-signals@8.0.0: + resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} + engines: {node: '>=18.18.0'} + hyperid@3.3.0: resolution: {integrity: sha512-7qhCVT4MJIoEsNcbhglhdmBKb09QtcmJNiIQGq7js/Khf5FtQQ9bzcAuloeqBeee7XD7JqDeve9KNlQya5tSGQ==} @@ -8839,10 +8928,18 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -9466,6 +9563,10 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -9588,6 +9689,10 @@ packages: parse-latin@7.0.0: resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse-numeric-range@1.3.0: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} @@ -9944,6 +10049,10 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} + prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} @@ -10316,10 +10425,6 @@ packages: simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} - sirv@3.0.0: resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} engines: {node: '>=18'} @@ -10429,6 +10534,10 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -10709,6 +10818,10 @@ packages: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -10809,10 +10922,10 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-hot-client@0.2.3: - resolution: {integrity: sha512-rOGAV7rUlUHX89fP2p2v0A2WWvV3QMX2UYq0fRqsWSvFvev4atHWqjwGoKaZT1VTKyLGk533ecu3eyd0o59CAg==} + vite-hot-client@0.2.4: + resolution: {integrity: sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==} peerDependencies: - vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 vite-node@2.1.6: resolution: {integrity: sha512-DBfJY0n9JUwnyLxPSSUmEePT21j8JZp/sR9n+/gBwQU6DcQOioPdb8/pibWfXForbirSagZCilseYIwaL3f95A==} @@ -10824,8 +10937,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-plugin-inspect@0.8.7: - resolution: {integrity: sha512-/XXou3MVc13A5O9/2Nd6xczjrUwt7ZyI9h8pTnUMkr5SshLcb0PJUOVq2V+XVkdeU4njsqAtmK87THZuO2coGA==} + vite-plugin-inspect@0.8.8: + resolution: {integrity: sha512-aZlBuXsWUPJFmMK92GIv6lH7LrwG2POu4KJ+aEdcqnu92OAf+rhBnfMDQvxIJPEB7hE2t5EyY/PMgf5aDLT8EA==} engines: {node: '>=14'} peerDependencies: '@nuxt/kit': '*' @@ -10844,16 +10957,16 @@ packages: '@testing-library/jest-dom': optional: true - vite-plugin-vue-devtools@7.6.4: - resolution: {integrity: sha512-jxSsLyuETfmZ1OSrmnDp28BG6rmURrP7lkeyHW2gBFDyo+4dUcqVeQNMhbV7uKZn80mDdv06Mysw/5AdGxDvJQ==} + vite-plugin-vue-devtools@7.6.7: + resolution: {integrity: sha512-H1ZyjtpWjP5mHA5R15sQeYgAARuh2Myg3TDFXWZK6QOQRy8s3XjTIt319DogVjU/x3rC3L/jJQjIasRU04mWXA==} engines: {node: '>=v14.21.3'} peerDependencies: - vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 + vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 - vite-plugin-vue-inspector@5.2.0: - resolution: {integrity: sha512-wWxyb9XAtaIvV/Lr7cqB1HIzmHZFVUJsTNm3yAxkS87dgh/Ky4qr2wDEWNxF23fdhVa3jQ8MZREpr4XyiuaRqA==} + vite-plugin-vue-inspector@5.3.1: + resolution: {integrity: sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==} peerDependencies: - vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 + vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 vite-svg-loader@5.1.0: resolution: {integrity: sha512-M/wqwtOEjgb956/+m5ZrYT/Iq6Hax0OakWbokj8+9PXOnB7b/4AxESHieEtnNEy7ZpjsjYW1/5nK8fATQMmRxw==} @@ -11485,6 +11598,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.25.9 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-member-expression-to-functions@7.24.8': dependencies: '@babel/traverse': 7.25.9 @@ -11492,6 +11618,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.18.6': dependencies: '@babel/types': 7.26.0 @@ -11516,6 +11649,10 @@ snapshots: dependencies: '@babel/types': 7.26.0 + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.26.0 + '@babel/helper-plugin-utils@7.25.9': {} '@babel/helper-replace-supers@7.25.0(@babel/core@7.26.0)': @@ -11527,6 +11664,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': dependencies: '@babel/traverse': 7.25.9 @@ -11534,6 +11680,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.25.9': {} '@babel/helper-validator-identifier@7.25.9': {} @@ -11583,6 +11736,11 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -11622,6 +11780,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@7.26.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/runtime@7.25.6': dependencies: regenerator-runtime: 0.14.1 @@ -12778,6 +12947,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.27.4': optional: true + '@sec-ant/readable-stream@0.4.1': {} + '@shikijs/core@1.23.1': dependencies: '@shikijs/engine-javascript': 1.23.1 @@ -12807,6 +12978,8 @@ snapshots: '@sindresorhus/merge-streams@2.3.0': {} + '@sindresorhus/merge-streams@4.0.0': {} + '@solidjs/router@0.15.1(solid-js@1.9.3)': dependencies: solid-js: 1.9.3 @@ -13110,10 +13283,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@4.0.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2))': + '@vitejs/plugin-vue-jsx@4.1.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2))': dependencies: '@babel/core': 7.26.0 - '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0) '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0) vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) vue: 3.5.13(typescript@5.7.2) @@ -13281,7 +13454,7 @@ snapshots: '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/parser': 7.26.2 - '@vue/compiler-sfc': 3.5.12 + '@vue/compiler-sfc': 3.5.13 transitivePeerDependencies: - supports-color @@ -13345,21 +13518,21 @@ snapshots: '@vue/compiler-dom': 3.5.13 '@vue/shared': 3.5.13 - '@vue/devtools-core@7.6.4(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2))': + '@vue/devtools-core@7.6.7(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2))': dependencies: - '@vue/devtools-kit': 7.6.4 - '@vue/devtools-shared': 7.6.4 + '@vue/devtools-kit': 7.6.7 + '@vue/devtools-shared': 7.6.7 mitt: 3.0.1 - nanoid: 3.3.7 + nanoid: 5.0.9 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + vite-hot-client: 0.2.4(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) vue: 3.5.13(typescript@5.7.2) transitivePeerDependencies: - vite - '@vue/devtools-kit@7.6.4': + '@vue/devtools-kit@7.6.7': dependencies: - '@vue/devtools-shared': 7.6.4 + '@vue/devtools-shared': 7.6.7 birpc: 0.2.19 hookable: 5.5.3 mitt: 3.0.1 @@ -13367,7 +13540,7 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.1 - '@vue/devtools-shared@7.6.4': + '@vue/devtools-shared@7.6.7': dependencies: rfdc: 1.4.1 @@ -14267,6 +14440,21 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + execa@9.5.2: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.0 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 + expect-type@1.1.0: {} extend@3.0.2: {} @@ -14310,6 +14498,10 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -14418,6 +14610,11 @@ snapshots: get-stream@8.0.1: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -14711,6 +14908,8 @@ snapshots: human-signals@5.0.0: {} + human-signals@8.0.0: {} + hyperid@3.3.0: dependencies: buffer: 5.7.1 @@ -14804,10 +15003,14 @@ snapshots: is-stream@3.0.0: {} + is-stream@4.0.1: {} + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 + is-unicode-supported@2.1.0: {} + is-what@4.1.16: {} is-windows@1.0.2: {} @@ -15701,6 +15904,11 @@ snapshots: dependencies: path-key: 4.0.0 + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -15832,6 +16040,8 @@ snapshots: unist-util-visit-children: 3.0.0 vfile: 6.0.3 + parse-ms@4.0.0: {} + parse-numeric-range@1.3.0: {} parse-srcset@1.0.2: {} @@ -16201,6 +16411,10 @@ snapshots: pretty-bytes@6.1.1: {} + pretty-ms@9.2.0: + dependencies: + parse-ms: 4.0.0 + prismjs@1.29.0: {} progress@2.0.3: {} @@ -16739,12 +16953,6 @@ snapshots: dependencies: is-arrayish: 0.3.2 - sirv@2.0.4: - dependencies: - '@polka/url': 1.0.0-next.25 - mrmime: 2.0.0 - totalist: 3.0.1 - sirv@3.0.0: dependencies: '@polka/url': 1.0.0-next.25 @@ -16852,6 +17060,8 @@ snapshots: strip-final-newline@3.0.0: {} + strip-final-newline@4.0.0: {} + strip-json-comments@3.1.1: {} strip-json-comments@5.0.1: {} @@ -17166,6 +17376,8 @@ snapshots: unicorn-magic@0.1.0: {} + unicorn-magic@0.3.0: {} + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -17296,7 +17508,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-hot-client@0.2.3(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)): + vite-hot-client@0.2.4(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)): dependencies: vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) @@ -17339,7 +17551,7 @@ snapshots: - supports-color - terser - vite-plugin-inspect@0.8.7(rollup@4.27.4)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)): + vite-plugin-inspect@0.8.8(rollup@4.27.4)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.3(rollup@4.27.4) @@ -17349,7 +17561,7 @@ snapshots: open: 10.1.0 perfect-debounce: 1.0.0 picocolors: 1.1.1 - sirv: 2.0.4 + sirv: 3.0.0 vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) transitivePeerDependencies: - rollup @@ -17368,23 +17580,23 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-vue-devtools@7.6.4(rollup@4.27.4)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)): + vite-plugin-vue-devtools@7.6.7(rollup@4.27.4)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)): dependencies: - '@vue/devtools-core': 7.6.4(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) - '@vue/devtools-kit': 7.6.4 - '@vue/devtools-shared': 7.6.4 - execa: 8.0.1 + '@vue/devtools-core': 7.6.7(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) + '@vue/devtools-kit': 7.6.7 + '@vue/devtools-shared': 7.6.7 + execa: 9.5.2 sirv: 3.0.0 vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) - vite-plugin-inspect: 0.8.7(rollup@4.27.4)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) - vite-plugin-vue-inspector: 5.2.0(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + vite-plugin-inspect: 0.8.8(rollup@4.27.4)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) + vite-plugin-vue-inspector: 5.3.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.2.0(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)): + vite-plugin-vue-inspector@5.3.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)): dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.26.0) @@ -17392,7 +17604,7 @@ snapshots: '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.26.0) '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0) - '@vue/compiler-dom': 3.5.12 + '@vue/compiler-dom': 3.5.13 kolorist: 1.8.0 magic-string: 0.30.14 vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1) From 495f46bca78665732e51c629d93a68fa392b88a4 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 10 Dec 2024 09:53:58 +0000 Subject: [PATCH 07/35] fix(svg): conditional opt-in (#12694) * fix(svg): conditional opt-in * add todo * Update packages/astro/src/assets/utils/node/emitAsset.ts Co-authored-by: Erika <3019731+Princesseuh@users.noreply.github.com> --------- Co-authored-by: Erika <3019731+Princesseuh@users.noreply.github.com> --- .changeset/fast-adults-lick.md | 6 ++++++ packages/astro/src/assets/utils/node/emitAsset.ts | 4 +++- packages/astro/src/assets/vite-plugin-assets.ts | 7 ++++++- packages/astro/src/content/content-layer.ts | 1 + packages/astro/src/content/runtime-assets.ts | 2 ++ packages/astro/src/content/utils.ts | 10 +++++++++- .../astro/src/content/vite-plugin-content-imports.ts | 2 ++ .../integrations/markdoc/src/content-entry-type.ts | 1 + 8 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 .changeset/fast-adults-lick.md diff --git a/.changeset/fast-adults-lick.md b/.changeset/fast-adults-lick.md new file mode 100644 index 0000000000..22b2617bed --- /dev/null +++ b/.changeset/fast-adults-lick.md @@ -0,0 +1,6 @@ +--- +'@astrojs/markdoc': patch +'astro': patch +--- + +Fixes a bug where the experimental feature `experimental.svg` was incorrectly used when generating ESM images diff --git a/packages/astro/src/assets/utils/node/emitAsset.ts b/packages/astro/src/assets/utils/node/emitAsset.ts index 79a5287f64..1337ac8800 100644 --- a/packages/astro/src/assets/utils/node/emitAsset.ts +++ b/packages/astro/src/assets/utils/node/emitAsset.ts @@ -15,6 +15,7 @@ export async function emitESMImage( _watchMode: boolean, // FIX: in Astro 6, this function should not be passed in dev mode at all. // Or rethink the API so that a function that throws isn't passed through. + experimentalSvgEnabled: boolean, fileEmitter?: FileEmitter, ): Promise { if (!id) { @@ -44,7 +45,8 @@ export async function emitESMImage( }); // Attach file data for SVGs - if (fileMetadata.format === 'svg') { + // TODO: this is a workaround to prevent a memory leak, and it must be fixed before we remove the experimental flag, see + if (fileMetadata.format === 'svg' && experimentalSvgEnabled === true) { emittedImage.contents = fileData; } diff --git a/packages/astro/src/assets/vite-plugin-assets.ts b/packages/astro/src/assets/vite-plugin-assets.ts index e09fc15975..abce0c9b7e 100644 --- a/packages/astro/src/assets/vite-plugin-assets.ts +++ b/packages/astro/src/assets/vite-plugin-assets.ts @@ -205,7 +205,12 @@ export default function assets({ settings }: { settings: AstroSettings }): vite. } const emitFile = shouldEmitFile ? this.emitFile : undefined; - const imageMetadata = await emitESMImage(id, this.meta.watchMode, emitFile); + const imageMetadata = await emitESMImage( + id, + this.meta.watchMode, + !!settings.config.experimental.svg, + emitFile, + ); if (!imageMetadata) { throw new AstroError({ diff --git a/packages/astro/src/content/content-layer.ts b/packages/astro/src/content/content-layer.ts index 235bbb1fd1..71a58f6d17 100644 --- a/packages/astro/src/content/content-layer.ts +++ b/packages/astro/src/content/content-layer.ts @@ -206,6 +206,7 @@ export class ContentLayer { }, collectionWithResolvedSchema, false, + !!this.#settings.config.experimental.svg ); return parsedData; diff --git a/packages/astro/src/content/runtime-assets.ts b/packages/astro/src/content/runtime-assets.ts index 95b5092fe3..74204e127d 100644 --- a/packages/astro/src/content/runtime-assets.ts +++ b/packages/astro/src/content/runtime-assets.ts @@ -7,6 +7,7 @@ export function createImage( pluginContext: PluginContext, shouldEmitFile: boolean, entryFilePath: string, + experimentalSvgEnabled: boolean, ) { return () => { return z.string().transform(async (imagePath, ctx) => { @@ -14,6 +15,7 @@ export function createImage( const metadata = (await emitESMImage( resolvedFilePath, pluginContext.meta.watchMode, + experimentalSvgEnabled, shouldEmitFile ? pluginContext.emitFile : undefined, )) as OmitBrand; diff --git a/packages/astro/src/content/utils.ts b/packages/astro/src/content/utils.ts index 16d703fc78..3b9588c0b6 100644 --- a/packages/astro/src/content/utils.ts +++ b/packages/astro/src/content/utils.ts @@ -164,6 +164,7 @@ export async function getEntryDataAndImages< }, collectionConfig: CollectionConfig, shouldEmitFile: boolean, + experimentalSvgEnabled: boolean, pluginContext?: PluginContext, ): Promise<{ data: TOutputData; imageImports: Array }> { let data: TOutputData; @@ -182,7 +183,12 @@ export async function getEntryDataAndImages< if (typeof schema === 'function') { if (pluginContext) { schema = schema({ - image: createImage(pluginContext, shouldEmitFile, entry._internal.filePath), + image: createImage( + pluginContext, + shouldEmitFile, + entry._internal.filePath, + experimentalSvgEnabled, + ), }); } else if (collectionConfig.type === CONTENT_LAYER_TYPE) { schema = schema({ @@ -257,12 +263,14 @@ export async function getEntryData( }, collectionConfig: CollectionConfig, shouldEmitFile: boolean, + experimentalSvgEnabled: boolean, pluginContext?: PluginContext, ) { const { data } = await getEntryDataAndImages( entry, collectionConfig, shouldEmitFile, + experimentalSvgEnabled, pluginContext, ); return data; diff --git a/packages/astro/src/content/vite-plugin-content-imports.ts b/packages/astro/src/content/vite-plugin-content-imports.ts index 4950d2d9b2..68f9cf706f 100644 --- a/packages/astro/src/content/vite-plugin-content-imports.ts +++ b/packages/astro/src/content/vite-plugin-content-imports.ts @@ -245,6 +245,7 @@ async function getContentEntryModule( { id, collection, _internal, unvalidatedData }, collectionConfig, params.shouldEmitFile, + !!params.config.experimental.svg, pluginContext, ) : unvalidatedData; @@ -280,6 +281,7 @@ async function getDataEntryModule( { id, collection, _internal, unvalidatedData }, collectionConfig, params.shouldEmitFile, + !!params.config.experimental.svg, pluginContext, ) : unvalidatedData; diff --git a/packages/integrations/markdoc/src/content-entry-type.ts b/packages/integrations/markdoc/src/content-entry-type.ts index 67a8be5317..998d8fbb55 100644 --- a/packages/integrations/markdoc/src/content-entry-type.ts +++ b/packages/integrations/markdoc/src/content-entry-type.ts @@ -312,6 +312,7 @@ async function emitOptimizedImages( const src = await emitESMImage( resolved.id, ctx.pluginContext.meta.watchMode, + !!ctx.astroConfig.experimental.svg, ctx.pluginContext.emitFile, ); From 70cbd476943aa0ef28ee588df8ea1de3a3d946c8 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 10 Dec 2024 09:54:52 +0000 Subject: [PATCH 08/35] [ci] format --- packages/astro/src/content/content-layer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/src/content/content-layer.ts b/packages/astro/src/content/content-layer.ts index 71a58f6d17..e8c772a2c9 100644 --- a/packages/astro/src/content/content-layer.ts +++ b/packages/astro/src/content/content-layer.ts @@ -206,7 +206,7 @@ export class ContentLayer { }, collectionWithResolvedSchema, false, - !!this.#settings.config.experimental.svg + !!this.#settings.config.experimental.svg, ); return parsedData; From 0d1eab560d56c51c359bbd35e8bfb51e238611ee Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 10 Dec 2024 10:23:07 +0000 Subject: [PATCH 09/35] fix: escape content module import paths (#12705) --- .changeset/blue-spiders-carry.md | 5 +++++ .../astro/src/content/mutable-data-store.ts | 2 +- .../content-outside-src-mdx/I'm back!.mdx | 16 ++++++++++++++++ .../content-outside-src-mdx/I'm back.jpg | Bin 0 -> 57598 bytes 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 .changeset/blue-spiders-carry.md create mode 100644 packages/astro/test/fixtures/content-layer-rendering/content-outside-src-mdx/I'm back!.mdx create mode 100644 packages/astro/test/fixtures/content-layer-rendering/content-outside-src-mdx/I'm back.jpg diff --git a/.changeset/blue-spiders-carry.md b/.changeset/blue-spiders-carry.md new file mode 100644 index 0000000000..a9819f5db5 --- /dev/null +++ b/.changeset/blue-spiders-carry.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fixes a bug where MDX files with certain characters in the name would cause builds to fail diff --git a/packages/astro/src/content/mutable-data-store.ts b/packages/astro/src/content/mutable-data-store.ts index 9587b30596..fdffec7cb8 100644 --- a/packages/astro/src/content/mutable-data-store.ts +++ b/packages/astro/src/content/mutable-data-store.ts @@ -137,7 +137,7 @@ export default new Map([${exports.join(', ')}]); // We then export them all, mapped by the import id, so we can find them again in the build. const lines: Array = []; for (const [fileName, specifier] of this.#moduleImports) { - lines.push(`['${fileName}', () => import('${specifier}')]`); + lines.push(`[${JSON.stringify(fileName)}, () => import(${JSON.stringify(specifier)})]`); } const code = ` export default new Map([\n${lines.join(',\n')}]); diff --git a/packages/astro/test/fixtures/content-layer-rendering/content-outside-src-mdx/I'm back!.mdx b/packages/astro/test/fixtures/content-layer-rendering/content-outside-src-mdx/I'm back!.mdx new file mode 100644 index 0000000000..a4442fb6f2 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer-rendering/content-outside-src-mdx/I'm back!.mdx @@ -0,0 +1,16 @@ +--- +title: I'm back! +description: 'Introduction to Iguana.' +publishedDate: 'Sat May 21 2022 00:00:00 GMT-0400 (Eastern Daylight Time)' +tags: [cats, felines] +--- + +import H2 from "../src/components/H2.astro"; + +

Iguana

+ +### Iguana + +This is a rendered entry + +![file](./I'm%20back.jpg) diff --git a/packages/astro/test/fixtures/content-layer-rendering/content-outside-src-mdx/I'm back.jpg b/packages/astro/test/fixtures/content-layer-rendering/content-outside-src-mdx/I'm back.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7455a726ef135d1a11e58b219659cb9a5ddb4e39 GIT binary patch literal 57598 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 z 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 z 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 literal 0 HcmV?d00001 From 316959355c3d59723ecb3e0f417becf1f03ddd74 Mon Sep 17 00:00:00 2001 From: Juraj Kapsz Date: Tue, 10 Dec 2024 13:43:44 +0100 Subject: [PATCH 10/35] fix: xclip process runtime (#12658) xclip process made `spawnSync` not [to return](https://nodejs.org/api/child_process.html#child_processspawnsynccommand-args-options:~:text=with%20the%20exception%20that%20the%20function%20will%20not%20return%20until%20the%20child%20process%20has%20fully%20closed). Further info at [Stack Overflow](https://stackoverflow.com/questions/52169670/node-child-process-execsync-hangs-with-xclip). Also updated the xclip arguments as per man pages for better familiarity, although the used arguments worked. --- .changeset/shy-worms-talk.md | 5 +++++ packages/astro/src/cli/info/index.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/shy-worms-talk.md diff --git a/.changeset/shy-worms-talk.md b/.changeset/shy-worms-talk.md new file mode 100644 index 0000000000..c22501e2d2 --- /dev/null +++ b/.changeset/shy-worms-talk.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fixes astro info copy to clipboard process not returning to prompt in certain cases. diff --git a/packages/astro/src/cli/info/index.ts b/packages/astro/src/cli/info/index.ts index 348d2fae3b..aca66ad719 100644 --- a/packages/astro/src/cli/info/index.ts +++ b/packages/astro/src/cli/info/index.ts @@ -66,7 +66,7 @@ export async function copyToClipboard(text: string, force?: boolean) { // Unix: check if a supported command is installed const unixCommands: Array<[string, Array]> = [ - ['xclip', ['-sel', 'clipboard', '-l', '1']], + ['xclip', ['-selection', 'clipboard', '-l', '1']], ['wl-copy', []], ]; for (const [unixCommand, unixArgs] of unixCommands) { @@ -101,7 +101,7 @@ export async function copyToClipboard(text: string, force?: boolean) { } try { - const result = spawnSync(command, args, { input: text }); + const result = spawnSync(command, args, { input: text, stdio: ['pipe', 'ignore', 'ignore'] }); if (result.error) { throw result.error; } From f6c4214042c68de137a69aa15dea81ed9cbc822a Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 10 Dec 2024 20:00:58 +0000 Subject: [PATCH 11/35] fix: correctly check isOnline with port (#12706) --- .changeset/wild-ducks-decide.md | 5 +++++ packages/upgrade/src/actions/verify.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/wild-ducks-decide.md diff --git a/.changeset/wild-ducks-decide.md b/.changeset/wild-ducks-decide.md new file mode 100644 index 0000000000..8a6f85be73 --- /dev/null +++ b/.changeset/wild-ducks-decide.md @@ -0,0 +1,5 @@ +--- +'@astrojs/upgrade': patch +--- + +Fixes a bug that caused registry URLs that specify a port to be incorrectly detected as offline. diff --git a/packages/upgrade/src/actions/verify.ts b/packages/upgrade/src/actions/verify.ts index 384df5134a..3b7c15a9e1 100644 --- a/packages/upgrade/src/actions/verify.ts +++ b/packages/upgrade/src/actions/verify.ts @@ -43,8 +43,8 @@ export async function verify( } function isOnline(registry: string): Promise { - const { host } = new URL(registry); - return dns.lookup(host).then( + const { hostname } = new URL(registry); + return dns.lookup(hostname).then( () => true, () => false, ); From 2aaed2d2a96ab35461af24e8d12b20f1da33983f Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 10 Dec 2024 20:48:38 +0000 Subject: [PATCH 12/35] fix(middleware): don't import via entrypoint (#12707) * fix(middleware): don't import via entrypoint * fix(middleware): don't import via entrypoint --- .changeset/bright-crabs-kick.md | 5 +++++ packages/astro/src/core/build/pipeline.ts | 10 +++++----- .../fixtures/middleware-full-ssr/package.json | 8 ++++++++ .../fixtures/middleware-full-ssr/src/error.js | 1 + .../middleware-full-ssr/src/middleware.js | 2 ++ .../middleware-full-ssr/src/pages/index.astro | 14 ++++++++++++++ packages/astro/test/middleware.test.js | 15 +++++++++++++++ pnpm-lock.yaml | 6 ++++++ 8 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 .changeset/bright-crabs-kick.md create mode 100644 packages/astro/test/fixtures/middleware-full-ssr/package.json create mode 100644 packages/astro/test/fixtures/middleware-full-ssr/src/error.js create mode 100644 packages/astro/test/fixtures/middleware-full-ssr/src/middleware.js create mode 100644 packages/astro/test/fixtures/middleware-full-ssr/src/pages/index.astro diff --git a/.changeset/bright-crabs-kick.md b/.changeset/bright-crabs-kick.md new file mode 100644 index 0000000000..c94a34e9cf --- /dev/null +++ b/.changeset/bright-crabs-kick.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fixes a bug where the middleware was incorrectly imported during the build diff --git a/packages/astro/src/core/build/pipeline.ts b/packages/astro/src/core/build/pipeline.ts index 14bb08662a..3908dffed2 100644 --- a/packages/astro/src/core/build/pipeline.ts +++ b/packages/astro/src/core/build/pipeline.ts @@ -131,11 +131,11 @@ export class BuildPipeline extends Pipeline { const renderers = await import(renderersEntryUrl.toString()); const middleware = internals.middlewareEntryPoint - ? await import(internals.middlewareEntryPoint.toString()).then((mod) => { - return function () { - return { onRequest: mod.onRequest }; - }; - }) + ? async function () { + // @ts-expect-error: the compiler can't understand the previous check + const mod = await import(internals.middlewareEntryPoint.toString()); + return { onRequest: mod.onRequest }; + } : manifest.middleware; if (!renderers) { diff --git a/packages/astro/test/fixtures/middleware-full-ssr/package.json b/packages/astro/test/fixtures/middleware-full-ssr/package.json new file mode 100644 index 0000000000..4f8b625c0b --- /dev/null +++ b/packages/astro/test/fixtures/middleware-full-ssr/package.json @@ -0,0 +1,8 @@ +{ + "name": "@test/middleware-full-ssr", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/middleware-full-ssr/src/error.js b/packages/astro/test/fixtures/middleware-full-ssr/src/error.js new file mode 100644 index 0000000000..6eed03a82c --- /dev/null +++ b/packages/astro/test/fixtures/middleware-full-ssr/src/error.js @@ -0,0 +1 @@ +throw new Error("Shoud not error at build time") diff --git a/packages/astro/test/fixtures/middleware-full-ssr/src/middleware.js b/packages/astro/test/fixtures/middleware-full-ssr/src/middleware.js new file mode 100644 index 0000000000..0061049c13 --- /dev/null +++ b/packages/astro/test/fixtures/middleware-full-ssr/src/middleware.js @@ -0,0 +1,2 @@ +import "./error.js" +export const onRequest = (_ , next) => next(); diff --git a/packages/astro/test/fixtures/middleware-full-ssr/src/pages/index.astro b/packages/astro/test/fixtures/middleware-full-ssr/src/pages/index.astro new file mode 100644 index 0000000000..395a4d695c --- /dev/null +++ b/packages/astro/test/fixtures/middleware-full-ssr/src/pages/index.astro @@ -0,0 +1,14 @@ +--- +const data = Astro.locals; +--- + + + + Testing + + + + Index +

{data?.name}

+ + diff --git a/packages/astro/test/middleware.test.js b/packages/astro/test/middleware.test.js index 26bc06d77f..c7c95b5b66 100644 --- a/packages/astro/test/middleware.test.js +++ b/packages/astro/test/middleware.test.js @@ -171,6 +171,21 @@ describe('Middleware in PROD mode, SSG', () => { }); }); +describe('Middleware should not be executed or imported during', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + + it('should build the project without errors', async () => { + fixture = await loadFixture({ + root: './fixtures/middleware-full-ssr/', + output: 'server', + adapter: testAdapter({}), + }); + await fixture.build(); + assert.ok('Should build'); + }); +}); + describe('Middleware API in PROD mode, SSR', () => { /** @type {import('./test-utils').Fixture} */ let fixture; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0270d490a2..a351d30808 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3324,6 +3324,12 @@ importers: specifier: workspace:* version: link:../../.. + packages/astro/test/fixtures/middleware-full-ssr: + dependencies: + astro: + specifier: workspace:* + version: link:../../.. + packages/astro/test/fixtures/middleware-no-user-middleware: dependencies: astro: From 97c9265754b78af12ad1e399cc75028435028dfa Mon Sep 17 00:00:00 2001 From: Brian Kimball Date: Wed, 11 Dec 2024 04:02:41 -0500 Subject: [PATCH 13/35] Add React 19 stable as peer dependency for React integration (#12678) * Add React 19 as peer dependency * Add React 19 as peer dependency --------- Co-authored-by: bskimball --- .changeset/tame-countries-beg.md | 5 +++++ packages/integrations/react/package.json | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 .changeset/tame-countries-beg.md diff --git a/.changeset/tame-countries-beg.md b/.changeset/tame-countries-beg.md new file mode 100644 index 0000000000..2ef8915500 --- /dev/null +++ b/.changeset/tame-countries-beg.md @@ -0,0 +1,5 @@ +--- +'@astrojs/react': minor +--- + +Add React 19 stable to peer dependencies diff --git a/packages/integrations/react/package.json b/packages/integrations/react/package.json index b7302a804c..cd7d17632c 100644 --- a/packages/integrations/react/package.json +++ b/packages/integrations/react/package.json @@ -63,10 +63,10 @@ "react-dom": "^18.3.1" }, "peerDependencies": { - "@types/react": "^17.0.50 || ^18.0.21", - "@types/react-dom": "^17.0.17 || ^18.0.6", - "react": "^17.0.2 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0-beta" + "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", + "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", + "react": "^17.0.2 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" }, "engines": { "node": "^18.17.1 || ^20.3.0 || >=22.0.0" From b01c74aeccc4ec76b64fa75d163df58274b37970 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 11 Dec 2024 10:21:44 +0000 Subject: [PATCH 14/35] fix: strip query string before checking md extension (#12712) --- .changeset/tidy-ligers-tan.md | 5 ++++ packages/astro/src/core/util.ts | 4 +++- packages/astro/test/astro-markdown.test.js | 23 ++++++++++++++++++- .../src/pages/false-positive.astro | 5 ++++ 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 .changeset/tidy-ligers-tan.md create mode 100644 packages/astro/test/fixtures/astro-markdown/src/pages/false-positive.astro diff --git a/.changeset/tidy-ligers-tan.md b/.changeset/tidy-ligers-tan.md new file mode 100644 index 0000000000..9891877bf8 --- /dev/null +++ b/.changeset/tidy-ligers-tan.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fixes a bug which misidentified pages as markdown if a query string ended in a markdown extension diff --git a/packages/astro/src/core/util.ts b/packages/astro/src/core/util.ts index f9dd0ced8b..458fb9bdc3 100644 --- a/packages/astro/src/core/util.ts +++ b/packages/astro/src/core/util.ts @@ -18,9 +18,11 @@ export function isURL(value: unknown): value is URL { } /** Check if a file is a markdown file based on its extension */ export function isMarkdownFile(fileId: string, option?: { suffix?: string }): boolean { + // Strip query string + const id = fileId.split("?")[0]; const _suffix = option?.suffix ?? ''; for (let markdownFileExtension of SUPPORTED_MARKDOWN_FILE_EXTENSIONS) { - if (fileId.endsWith(`${markdownFileExtension}${_suffix}`)) return true; + if (id.endsWith(`${markdownFileExtension}${_suffix}`)) return true; } return false; } diff --git a/packages/astro/test/astro-markdown.test.js b/packages/astro/test/astro-markdown.test.js index d0a49c873d..0dae61ebd6 100644 --- a/packages/astro/test/astro-markdown.test.js +++ b/packages/astro/test/astro-markdown.test.js @@ -1,5 +1,5 @@ import assert from 'node:assert/strict'; -import { before, describe, it } from 'node:test'; +import { before, describe, it, after } from 'node:test'; import * as cheerio from 'cheerio'; import { fixLineEndings, loadFixture } from './test-utils.js'; @@ -154,4 +154,25 @@ describe('Astro Markdown', () => { assert.ok(title.includes('import.meta.env.TITLE')); }); }); + + describe('dev', () => { + let devServer; + + before(async () => { + devServer = await fixture.startDevServer(); + }); + + it('ignores .md extensions on query params', async () => { + const res = await fixture.fetch('/false-positive?page=page.md'); + assert.ok(res.ok); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal($('p').text(), 'the page is not markdown'); + }); + + after(async () => { + await devServer.stop(); + }); + + }); }); diff --git a/packages/astro/test/fixtures/astro-markdown/src/pages/false-positive.astro b/packages/astro/test/fixtures/astro-markdown/src/pages/false-positive.astro new file mode 100644 index 0000000000..2f39eceadb --- /dev/null +++ b/packages/astro/test/fixtures/astro-markdown/src/pages/false-positive.astro @@ -0,0 +1,5 @@ +--- +let page = "not markdown" +--- + +

the page is {page}

From d33c2151a37e71ba727c54ef30339df859148612 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 11 Dec 2024 10:22:32 +0000 Subject: [PATCH 15/35] [ci] format --- packages/astro/src/core/util.ts | 2 +- packages/astro/test/astro-markdown.test.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/astro/src/core/util.ts b/packages/astro/src/core/util.ts index 458fb9bdc3..88e1de81a9 100644 --- a/packages/astro/src/core/util.ts +++ b/packages/astro/src/core/util.ts @@ -19,7 +19,7 @@ export function isURL(value: unknown): value is URL { /** Check if a file is a markdown file based on its extension */ export function isMarkdownFile(fileId: string, option?: { suffix?: string }): boolean { // Strip query string - const id = fileId.split("?")[0]; + const id = fileId.split('?')[0]; const _suffix = option?.suffix ?? ''; for (let markdownFileExtension of SUPPORTED_MARKDOWN_FILE_EXTENSIONS) { if (id.endsWith(`${markdownFileExtension}${_suffix}`)) return true; diff --git a/packages/astro/test/astro-markdown.test.js b/packages/astro/test/astro-markdown.test.js index 0dae61ebd6..9d41673418 100644 --- a/packages/astro/test/astro-markdown.test.js +++ b/packages/astro/test/astro-markdown.test.js @@ -1,5 +1,5 @@ import assert from 'node:assert/strict'; -import { before, describe, it, after } from 'node:test'; +import { after, before, describe, it } from 'node:test'; import * as cheerio from 'cheerio'; import { fixLineEndings, loadFixture } from './test-utils.js'; @@ -173,6 +173,5 @@ describe('Astro Markdown', () => { after(async () => { await devServer.stop(); }); - }); }); From 99266fa2898289a172d70a5ac3ffad7a5dcd2867 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 11 Dec 2024 11:06:55 +0000 Subject: [PATCH 16/35] chore: refactor query param strip (#12714) --- packages/astro/src/core/util.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/astro/src/core/util.ts b/packages/astro/src/core/util.ts index 88e1de81a9..3a394764b5 100644 --- a/packages/astro/src/core/util.ts +++ b/packages/astro/src/core/util.ts @@ -5,7 +5,7 @@ import type { AstroSettings } from '../types/astro.js'; import type { AstroConfig } from '../types/public/config.js'; import type { RouteType } from '../types/public/internal.js'; import { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from './constants.js'; -import { removeTrailingForwardSlash, slash } from './path.js'; +import { removeTrailingForwardSlash, slash, removeQueryString } from './path.js'; /** Returns true if argument is an object of any prototype/class (but not null). */ export function isObject(value: unknown): value is Record { @@ -18,8 +18,7 @@ export function isURL(value: unknown): value is URL { } /** Check if a file is a markdown file based on its extension */ export function isMarkdownFile(fileId: string, option?: { suffix?: string }): boolean { - // Strip query string - const id = fileId.split('?')[0]; + const id = removeQueryString(fileId); const _suffix = option?.suffix ?? ''; for (let markdownFileExtension of SUPPORTED_MARKDOWN_FILE_EXTENSIONS) { if (id.endsWith(`${markdownFileExtension}${_suffix}`)) return true; From b3dfd9b01bd7424eb67bfbc2612544af5be09442 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 11 Dec 2024 11:07:45 +0000 Subject: [PATCH 17/35] [ci] format --- packages/astro/src/core/util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/src/core/util.ts b/packages/astro/src/core/util.ts index 3a394764b5..f0447529a9 100644 --- a/packages/astro/src/core/util.ts +++ b/packages/astro/src/core/util.ts @@ -5,7 +5,7 @@ import type { AstroSettings } from '../types/astro.js'; import type { AstroConfig } from '../types/public/config.js'; import type { RouteType } from '../types/public/internal.js'; import { SUPPORTED_MARKDOWN_FILE_EXTENSIONS } from './constants.js'; -import { removeTrailingForwardSlash, slash, removeQueryString } from './path.js'; +import { removeQueryString, removeTrailingForwardSlash, slash } from './path.js'; /** Returns true if argument is an object of any prototype/class (but not null). */ export function isObject(value: unknown): value is Record { From 929ce2832560f9422a4a9ccb899e0f153d2a3471 Mon Sep 17 00:00:00 2001 From: "Houston (Bot)" <108291165+astrobot-houston@users.noreply.github.com> Date: Wed, 11 Dec 2024 03:07:58 -0800 Subject: [PATCH 18/35] [ci] release (#12698) Co-authored-by: github-actions[bot] --- .changeset/blue-spiders-carry.md | 5 -- .changeset/bright-crabs-kick.md | 5 -- .changeset/famous-teachers-hug.md | 5 -- .changeset/fast-adults-lick.md | 6 -- .changeset/green-coins-tie.md | 5 -- .changeset/shy-worms-talk.md | 5 -- .changeset/tame-countries-beg.md | 5 -- .changeset/tidy-ligers-tan.md | 5 -- .changeset/wild-ducks-decide.md | 5 -- examples/basics/package.json | 2 +- examples/blog/package.json | 2 +- examples/component/package.json | 2 +- examples/container-with-vitest/package.json | 4 +- examples/framework-alpine/package.json | 2 +- examples/framework-multiple/package.json | 6 +- examples/framework-preact/package.json | 2 +- examples/framework-react/package.json | 4 +- examples/framework-solid/package.json | 2 +- examples/framework-svelte/package.json | 2 +- examples/framework-vue/package.json | 4 +- examples/hackernews/package.json | 2 +- examples/integration/package.json | 2 +- examples/minimal/package.json | 2 +- examples/portfolio/package.json | 2 +- examples/ssr/package.json | 2 +- examples/starlog/package.json | 2 +- examples/toolbar-app/package.json | 2 +- examples/with-markdoc/package.json | 4 +- examples/with-mdx/package.json | 2 +- examples/with-nanostores/package.json | 2 +- examples/with-tailwindcss/package.json | 2 +- examples/with-vitest/package.json | 2 +- packages/astro/CHANGELOG.md | 16 ++++ packages/astro/package.json | 2 +- packages/integrations/markdoc/CHANGELOG.md | 6 ++ packages/integrations/markdoc/package.json | 2 +- packages/integrations/react/CHANGELOG.md | 6 ++ packages/integrations/react/package.json | 2 +- packages/integrations/vue/CHANGELOG.md | 6 ++ packages/integrations/vue/package.json | 2 +- packages/upgrade/CHANGELOG.md | 6 ++ packages/upgrade/package.json | 2 +- pnpm-lock.yaml | 88 +++++++-------------- 43 files changed, 103 insertions(+), 139 deletions(-) delete mode 100644 .changeset/blue-spiders-carry.md delete mode 100644 .changeset/bright-crabs-kick.md delete mode 100644 .changeset/famous-teachers-hug.md delete mode 100644 .changeset/fast-adults-lick.md delete mode 100644 .changeset/green-coins-tie.md delete mode 100644 .changeset/shy-worms-talk.md delete mode 100644 .changeset/tame-countries-beg.md delete mode 100644 .changeset/tidy-ligers-tan.md delete mode 100644 .changeset/wild-ducks-decide.md diff --git a/.changeset/blue-spiders-carry.md b/.changeset/blue-spiders-carry.md deleted file mode 100644 index a9819f5db5..0000000000 --- a/.changeset/blue-spiders-carry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'astro': patch ---- - -Fixes a bug where MDX files with certain characters in the name would cause builds to fail diff --git a/.changeset/bright-crabs-kick.md b/.changeset/bright-crabs-kick.md deleted file mode 100644 index c94a34e9cf..0000000000 --- a/.changeset/bright-crabs-kick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'astro': patch ---- - -Fixes a bug where the middleware was incorrectly imported during the build diff --git a/.changeset/famous-teachers-hug.md b/.changeset/famous-teachers-hug.md deleted file mode 100644 index 988f2993f9..0000000000 --- a/.changeset/famous-teachers-hug.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'astro': patch ---- - -Fix a bug that caused builds to fail if an image had a quote mark in its name diff --git a/.changeset/fast-adults-lick.md b/.changeset/fast-adults-lick.md deleted file mode 100644 index 22b2617bed..0000000000 --- a/.changeset/fast-adults-lick.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@astrojs/markdoc': patch -'astro': patch ---- - -Fixes a bug where the experimental feature `experimental.svg` was incorrectly used when generating ESM images diff --git a/.changeset/green-coins-tie.md b/.changeset/green-coins-tie.md deleted file mode 100644 index 349bf67244..0000000000 --- a/.changeset/green-coins-tie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@astrojs/vue': patch ---- - -fix vite peer dependency issue for vue integration diff --git a/.changeset/shy-worms-talk.md b/.changeset/shy-worms-talk.md deleted file mode 100644 index c22501e2d2..0000000000 --- a/.changeset/shy-worms-talk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'astro': patch ---- - -Fixes astro info copy to clipboard process not returning to prompt in certain cases. diff --git a/.changeset/tame-countries-beg.md b/.changeset/tame-countries-beg.md deleted file mode 100644 index 2ef8915500..0000000000 --- a/.changeset/tame-countries-beg.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@astrojs/react': minor ---- - -Add React 19 stable to peer dependencies diff --git a/.changeset/tidy-ligers-tan.md b/.changeset/tidy-ligers-tan.md deleted file mode 100644 index 9891877bf8..0000000000 --- a/.changeset/tidy-ligers-tan.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'astro': patch ---- - -Fixes a bug which misidentified pages as markdown if a query string ended in a markdown extension diff --git a/.changeset/wild-ducks-decide.md b/.changeset/wild-ducks-decide.md deleted file mode 100644 index 8a6f85be73..0000000000 --- a/.changeset/wild-ducks-decide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@astrojs/upgrade': patch ---- - -Fixes a bug that caused registry URLs that specify a port to be incorrectly detected as offline. diff --git a/examples/basics/package.json b/examples/basics/package.json index 405176a207..0791668c38 100644 --- a/examples/basics/package.json +++ b/examples/basics/package.json @@ -10,6 +10,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^5.0.4" + "astro": "^5.0.5" } } diff --git a/examples/blog/package.json b/examples/blog/package.json index bee6d8b2e0..52fd4ed3a1 100644 --- a/examples/blog/package.json +++ b/examples/blog/package.json @@ -13,6 +13,6 @@ "@astrojs/mdx": "^4.0.2", "@astrojs/rss": "^4.0.10", "@astrojs/sitemap": "^3.2.1", - "astro": "^5.0.4" + "astro": "^5.0.5" } } diff --git a/examples/component/package.json b/examples/component/package.json index 9c4252bca6..794471fd9d 100644 --- a/examples/component/package.json +++ b/examples/component/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^5.0.4" + "astro": "^5.0.5" }, "peerDependencies": { "astro": "^4.0.0 || ^5.0.0" diff --git a/examples/container-with-vitest/package.json b/examples/container-with-vitest/package.json index b202ff1f26..8194688cfe 100644 --- a/examples/container-with-vitest/package.json +++ b/examples/container-with-vitest/package.json @@ -11,8 +11,8 @@ "test": "vitest run" }, "dependencies": { - "@astrojs/react": "^4.0.0", - "astro": "^5.0.4", + "@astrojs/react": "^4.1.0", + "astro": "^5.0.5", "react": "^18.3.1", "react-dom": "^18.3.1", "vitest": "^2.1.6" diff --git a/examples/framework-alpine/package.json b/examples/framework-alpine/package.json index 9970749bd5..d48bcbc833 100644 --- a/examples/framework-alpine/package.json +++ b/examples/framework-alpine/package.json @@ -13,6 +13,6 @@ "@astrojs/alpinejs": "^0.4.0", "@types/alpinejs": "^3.13.10", "alpinejs": "^3.14.3", - "astro": "^5.0.4" + "astro": "^5.0.5" } } diff --git a/examples/framework-multiple/package.json b/examples/framework-multiple/package.json index cc1a53493c..6759f7ffc5 100644 --- a/examples/framework-multiple/package.json +++ b/examples/framework-multiple/package.json @@ -11,13 +11,13 @@ }, "dependencies": { "@astrojs/preact": "^4.0.0", - "@astrojs/react": "^4.0.0", + "@astrojs/react": "^4.1.0", "@astrojs/solid-js": "^5.0.0", "@astrojs/svelte": "^7.0.1", - "@astrojs/vue": "^5.0.1", + "@astrojs/vue": "^5.0.2", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", - "astro": "^5.0.4", + "astro": "^5.0.5", "preact": "^10.24.3", "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/examples/framework-preact/package.json b/examples/framework-preact/package.json index 952656d3cc..9cb7beae5e 100644 --- a/examples/framework-preact/package.json +++ b/examples/framework-preact/package.json @@ -12,7 +12,7 @@ "dependencies": { "@astrojs/preact": "^4.0.0", "@preact/signals": "^1.3.0", - "astro": "^5.0.4", + "astro": "^5.0.5", "preact": "^10.24.3" } } diff --git a/examples/framework-react/package.json b/examples/framework-react/package.json index 3f666d4c1b..affb83dadd 100644 --- a/examples/framework-react/package.json +++ b/examples/framework-react/package.json @@ -10,10 +10,10 @@ "astro": "astro" }, "dependencies": { - "@astrojs/react": "^4.0.0", + "@astrojs/react": "^4.1.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", - "astro": "^5.0.4", + "astro": "^5.0.5", "react": "^18.3.1", "react-dom": "^18.3.1" } diff --git a/examples/framework-solid/package.json b/examples/framework-solid/package.json index 018099983f..091ec6531c 100644 --- a/examples/framework-solid/package.json +++ b/examples/framework-solid/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@astrojs/solid-js": "^5.0.0", - "astro": "^5.0.4", + "astro": "^5.0.5", "solid-js": "^1.9.3" } } diff --git a/examples/framework-svelte/package.json b/examples/framework-svelte/package.json index 6ccaa6dbc7..3fa8a0cda5 100644 --- a/examples/framework-svelte/package.json +++ b/examples/framework-svelte/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@astrojs/svelte": "^7.0.1", - "astro": "^5.0.4", + "astro": "^5.0.5", "svelte": "^5.1.16" } } diff --git a/examples/framework-vue/package.json b/examples/framework-vue/package.json index fe56cf7eff..60a470e4ed 100644 --- a/examples/framework-vue/package.json +++ b/examples/framework-vue/package.json @@ -10,8 +10,8 @@ "astro": "astro" }, "dependencies": { - "@astrojs/vue": "^5.0.1", - "astro": "^5.0.4", + "@astrojs/vue": "^5.0.2", + "astro": "^5.0.5", "vue": "^3.5.12" } } diff --git a/examples/hackernews/package.json b/examples/hackernews/package.json index f2f624df70..8153be2ece 100644 --- a/examples/hackernews/package.json +++ b/examples/hackernews/package.json @@ -11,6 +11,6 @@ }, "dependencies": { "@astrojs/node": "^9.0.0", - "astro": "^5.0.4" + "astro": "^5.0.5" } } diff --git a/examples/integration/package.json b/examples/integration/package.json index 41da0a86c2..320d3b6cd2 100644 --- a/examples/integration/package.json +++ b/examples/integration/package.json @@ -15,7 +15,7 @@ ], "scripts": {}, "devDependencies": { - "astro": "^5.0.4" + "astro": "^5.0.5" }, "peerDependencies": { "astro": "^4.0.0" diff --git a/examples/minimal/package.json b/examples/minimal/package.json index 1a58ed5178..93faeabeab 100644 --- a/examples/minimal/package.json +++ b/examples/minimal/package.json @@ -10,6 +10,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^5.0.4" + "astro": "^5.0.5" } } diff --git a/examples/portfolio/package.json b/examples/portfolio/package.json index 4a8e47a67a..7db23b1f68 100644 --- a/examples/portfolio/package.json +++ b/examples/portfolio/package.json @@ -10,6 +10,6 @@ "astro": "astro" }, "dependencies": { - "astro": "^5.0.4" + "astro": "^5.0.5" } } diff --git a/examples/ssr/package.json b/examples/ssr/package.json index 72b6d1b192..00f1358841 100644 --- a/examples/ssr/package.json +++ b/examples/ssr/package.json @@ -13,7 +13,7 @@ "dependencies": { "@astrojs/node": "^9.0.0", "@astrojs/svelte": "^7.0.1", - "astro": "^5.0.4", + "astro": "^5.0.5", "svelte": "^5.1.16" } } diff --git a/examples/starlog/package.json b/examples/starlog/package.json index 209c54c199..8497f04595 100644 --- a/examples/starlog/package.json +++ b/examples/starlog/package.json @@ -9,7 +9,7 @@ "astro": "astro" }, "dependencies": { - "astro": "^5.0.4", + "astro": "^5.0.5", "sass": "^1.80.6", "sharp": "^0.33.3" } diff --git a/examples/toolbar-app/package.json b/examples/toolbar-app/package.json index e137aea638..701bb6ad0a 100644 --- a/examples/toolbar-app/package.json +++ b/examples/toolbar-app/package.json @@ -15,6 +15,6 @@ "./app": "./dist/app.js" }, "devDependencies": { - "astro": "^5.0.4" + "astro": "^5.0.5" } } diff --git a/examples/with-markdoc/package.json b/examples/with-markdoc/package.json index 111e1486aa..4ebd866a95 100644 --- a/examples/with-markdoc/package.json +++ b/examples/with-markdoc/package.json @@ -10,7 +10,7 @@ "astro": "astro" }, "dependencies": { - "@astrojs/markdoc": "^0.12.2", - "astro": "^5.0.4" + "@astrojs/markdoc": "^0.12.3", + "astro": "^5.0.5" } } diff --git a/examples/with-mdx/package.json b/examples/with-mdx/package.json index 26c8dbb914..974009ed55 100644 --- a/examples/with-mdx/package.json +++ b/examples/with-mdx/package.json @@ -12,7 +12,7 @@ "dependencies": { "@astrojs/mdx": "^4.0.2", "@astrojs/preact": "^4.0.0", - "astro": "^5.0.4", + "astro": "^5.0.5", "preact": "^10.24.3" } } diff --git a/examples/with-nanostores/package.json b/examples/with-nanostores/package.json index dea7ea20ee..b99ca790fa 100644 --- a/examples/with-nanostores/package.json +++ b/examples/with-nanostores/package.json @@ -12,7 +12,7 @@ "dependencies": { "@astrojs/preact": "^4.0.0", "@nanostores/preact": "^0.5.2", - "astro": "^5.0.4", + "astro": "^5.0.5", "nanostores": "^0.11.3", "preact": "^10.24.3" } diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json index 2d8b72824b..4cc92b511a 100644 --- a/examples/with-tailwindcss/package.json +++ b/examples/with-tailwindcss/package.json @@ -13,7 +13,7 @@ "@astrojs/mdx": "^4.0.2", "@astrojs/tailwind": "^5.1.3", "@types/canvas-confetti": "^1.6.4", - "astro": "^5.0.4", + "astro": "^5.0.5", "autoprefixer": "^10.4.20", "canvas-confetti": "^1.9.3", "postcss": "^8.4.49", diff --git a/examples/with-vitest/package.json b/examples/with-vitest/package.json index 7896c5f74e..f20af36328 100644 --- a/examples/with-vitest/package.json +++ b/examples/with-vitest/package.json @@ -11,7 +11,7 @@ "test": "vitest" }, "dependencies": { - "astro": "^5.0.4", + "astro": "^5.0.5", "vitest": "^2.1.6" } } diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 5bcd4ccae0..58f4630de1 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,21 @@ # astro +## 5.0.5 + +### Patch Changes + +- [#12705](https://github.com/withastro/astro/pull/12705) [`0d1eab5`](https://github.com/withastro/astro/commit/0d1eab560d56c51c359bbd35e8bfb51e238611ee) Thanks [@ascorbic](https://github.com/ascorbic)! - Fixes a bug where MDX files with certain characters in the name would cause builds to fail + +- [#12707](https://github.com/withastro/astro/pull/12707) [`2aaed2d`](https://github.com/withastro/astro/commit/2aaed2d2a96ab35461af24e8d12b20f1da33983f) Thanks [@ematipico](https://github.com/ematipico)! - Fixes a bug where the middleware was incorrectly imported during the build + +- [#12697](https://github.com/withastro/astro/pull/12697) [`1c4a032`](https://github.com/withastro/astro/commit/1c4a032247747c830be94dbdd0c953511a6bfa53) Thanks [@ascorbic](https://github.com/ascorbic)! - Fix a bug that caused builds to fail if an image had a quote mark in its name + +- [#12694](https://github.com/withastro/astro/pull/12694) [`495f46b`](https://github.com/withastro/astro/commit/495f46bca78665732e51c629d93a68fa392b88a4) Thanks [@ematipico](https://github.com/ematipico)! - Fixes a bug where the experimental feature `experimental.svg` was incorrectly used when generating ESM images + +- [#12658](https://github.com/withastro/astro/pull/12658) [`3169593`](https://github.com/withastro/astro/commit/316959355c3d59723ecb3e0f417becf1f03ddd74) Thanks [@jurajkapsz](https://github.com/jurajkapsz)! - Fixes astro info copy to clipboard process not returning to prompt in certain cases. + +- [#12712](https://github.com/withastro/astro/pull/12712) [`b01c74a`](https://github.com/withastro/astro/commit/b01c74aeccc4ec76b64fa75d163df58274b37970) Thanks [@ascorbic](https://github.com/ascorbic)! - Fixes a bug which misidentified pages as markdown if a query string ended in a markdown extension + ## 5.0.4 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index c588c592df..8c7e85a445 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "astro", - "version": "5.0.4", + "version": "5.0.5", "description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.", "type": "module", "author": "withastro", diff --git a/packages/integrations/markdoc/CHANGELOG.md b/packages/integrations/markdoc/CHANGELOG.md index f85601a9a7..1b752b85b2 100644 --- a/packages/integrations/markdoc/CHANGELOG.md +++ b/packages/integrations/markdoc/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/markdoc +## 0.12.3 + +### Patch Changes + +- [#12694](https://github.com/withastro/astro/pull/12694) [`495f46b`](https://github.com/withastro/astro/commit/495f46bca78665732e51c629d93a68fa392b88a4) Thanks [@ematipico](https://github.com/ematipico)! - Fixes a bug where the experimental feature `experimental.svg` was incorrectly used when generating ESM images + ## 0.12.2 ### Patch Changes diff --git a/packages/integrations/markdoc/package.json b/packages/integrations/markdoc/package.json index 4c9c26967c..5421f82c12 100644 --- a/packages/integrations/markdoc/package.json +++ b/packages/integrations/markdoc/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/markdoc", "description": "Add support for Markdoc in your Astro site", - "version": "0.12.2", + "version": "0.12.3", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/packages/integrations/react/CHANGELOG.md b/packages/integrations/react/CHANGELOG.md index ad8fdd7301..794f34b25a 100644 --- a/packages/integrations/react/CHANGELOG.md +++ b/packages/integrations/react/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/react +## 4.1.0 + +### Minor Changes + +- [#12678](https://github.com/withastro/astro/pull/12678) [`97c9265`](https://github.com/withastro/astro/commit/97c9265754b78af12ad1e399cc75028435028dfa) Thanks [@bskimball](https://github.com/bskimball)! - Add React 19 stable to peer dependencies + ## 4.0.0 ### Major Changes diff --git a/packages/integrations/react/package.json b/packages/integrations/react/package.json index cd7d17632c..205f5b0377 100644 --- a/packages/integrations/react/package.json +++ b/packages/integrations/react/package.json @@ -1,7 +1,7 @@ { "name": "@astrojs/react", "description": "Use React components within Astro", - "version": "4.0.0", + "version": "4.1.0", "type": "module", "types": "./dist/index.d.ts", "author": "withastro", diff --git a/packages/integrations/vue/CHANGELOG.md b/packages/integrations/vue/CHANGELOG.md index a1f1bb1ae9..d0f6b8ee7f 100644 --- a/packages/integrations/vue/CHANGELOG.md +++ b/packages/integrations/vue/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/vue +## 5.0.2 + +### Patch Changes + +- [#12688](https://github.com/withastro/astro/pull/12688) [`7dc2fca`](https://github.com/withastro/astro/commit/7dc2fca2eeb646bf3fd362d21c5bbfe273838b5a) Thanks [@yoyo837](https://github.com/yoyo837)! - fix vite peer dependency issue for vue integration + ## 5.0.1 ### Patch Changes diff --git a/packages/integrations/vue/package.json b/packages/integrations/vue/package.json index 8e9c5d86d1..49928cefe1 100644 --- a/packages/integrations/vue/package.json +++ b/packages/integrations/vue/package.json @@ -1,6 +1,6 @@ { "name": "@astrojs/vue", - "version": "5.0.1", + "version": "5.0.2", "description": "Use Vue components within Astro", "type": "module", "types": "./dist/index.d.ts", diff --git a/packages/upgrade/CHANGELOG.md b/packages/upgrade/CHANGELOG.md index f0014da8d7..a41d315aab 100644 --- a/packages/upgrade/CHANGELOG.md +++ b/packages/upgrade/CHANGELOG.md @@ -1,5 +1,11 @@ # @astrojs/upgrade +## 0.4.2 + +### Patch Changes + +- [#12706](https://github.com/withastro/astro/pull/12706) [`f6c4214`](https://github.com/withastro/astro/commit/f6c4214042c68de137a69aa15dea81ed9cbc822a) Thanks [@ascorbic](https://github.com/ascorbic)! - Fixes a bug that caused registry URLs that specify a port to be incorrectly detected as offline. + ## 0.4.1 ### Patch Changes diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index c3cc86f00a..ae633f2302 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@astrojs/upgrade", - "version": "0.4.1", + "version": "0.4.2", "type": "module", "author": "withastro", "license": "MIT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a351d30808..e47377c548 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -142,7 +142,7 @@ importers: examples/basics: dependencies: astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro examples/blog: @@ -157,22 +157,22 @@ importers: specifier: ^3.2.1 version: link:../../packages/integrations/sitemap astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro examples/component: devDependencies: astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro examples/container-with-vitest: dependencies: '@astrojs/react': - specifier: ^4.0.0 + specifier: ^4.1.0 version: link:../../packages/integrations/react astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro react: specifier: ^18.3.1 @@ -203,7 +203,7 @@ importers: specifier: ^3.14.3 version: 3.14.3 astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro examples/framework-multiple: @@ -212,7 +212,7 @@ importers: specifier: ^4.0.0 version: link:../../packages/integrations/preact '@astrojs/react': - specifier: ^4.0.0 + specifier: ^4.1.0 version: link:../../packages/integrations/react '@astrojs/solid-js': specifier: ^5.0.0 @@ -221,7 +221,7 @@ importers: specifier: ^7.0.1 version: link:../../packages/integrations/svelte '@astrojs/vue': - specifier: ^5.0.1 + specifier: ^5.0.2 version: link:../../packages/integrations/vue '@types/react': specifier: ^18.3.12 @@ -230,7 +230,7 @@ importers: specifier: ^18.3.1 version: 18.3.1 astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro preact: specifier: ^10.24.3 @@ -260,7 +260,7 @@ importers: specifier: ^1.3.0 version: 1.3.0(preact@10.24.3) astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro preact: specifier: ^10.24.3 @@ -269,7 +269,7 @@ importers: examples/framework-react: dependencies: '@astrojs/react': - specifier: ^4.0.0 + specifier: ^4.1.0 version: link:../../packages/integrations/react '@types/react': specifier: ^18.3.12 @@ -278,7 +278,7 @@ importers: specifier: ^18.3.1 version: 18.3.1 astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro react: specifier: ^18.3.1 @@ -293,7 +293,7 @@ importers: specifier: ^5.0.0 version: link:../../packages/integrations/solid astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro solid-js: specifier: ^1.9.3 @@ -305,7 +305,7 @@ importers: specifier: ^7.0.1 version: link:../../packages/integrations/svelte astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro svelte: specifier: ^5.1.16 @@ -314,10 +314,10 @@ importers: examples/framework-vue: dependencies: '@astrojs/vue': - specifier: ^5.0.1 + specifier: ^5.0.2 version: link:../../packages/integrations/vue astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro vue: specifier: ^3.5.12 @@ -329,25 +329,25 @@ importers: specifier: ^9.0.0 version: 9.0.0(astro@packages+astro) astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro examples/integration: devDependencies: astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro examples/minimal: dependencies: astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro examples/portfolio: dependencies: astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro examples/ssr: @@ -359,7 +359,7 @@ importers: specifier: ^7.0.1 version: link:../../packages/integrations/svelte astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro svelte: specifier: ^5.1.16 @@ -368,7 +368,7 @@ importers: examples/starlog: dependencies: astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro sass: specifier: ^1.80.6 @@ -380,16 +380,16 @@ importers: examples/toolbar-app: devDependencies: astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro examples/with-markdoc: dependencies: '@astrojs/markdoc': - specifier: ^0.12.2 + specifier: ^0.12.3 version: link:../../packages/integrations/markdoc astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro examples/with-mdx: @@ -401,7 +401,7 @@ importers: specifier: ^4.0.0 version: link:../../packages/integrations/preact astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro preact: specifier: ^10.24.3 @@ -416,7 +416,7 @@ importers: specifier: ^0.5.2 version: 0.5.2(nanostores@0.11.3)(preact@10.24.3) astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro nanostores: specifier: ^0.11.3 @@ -437,7 +437,7 @@ importers: specifier: ^1.6.4 version: 1.6.4 astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro autoprefixer: specifier: ^10.4.20 @@ -455,7 +455,7 @@ importers: examples/with-vitest: dependencies: astro: - specifier: ^5.0.4 + specifier: ^5.0.5 version: link:../../packages/astro vitest: specifier: ^2.1.6 @@ -5877,28 +5877,24 @@ packages: engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - libc: [musl] '@biomejs/cli-linux-arm64@1.9.3': resolution: {integrity: sha512-vJkAimD2+sVviNTbaWOGqEBy31cW0ZB52KtpVIbkuma7PlfII3tsLhFa+cwbRAcRBkobBBhqZ06hXoZAN8NODQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - libc: [glibc] '@biomejs/cli-linux-x64-musl@1.9.3': resolution: {integrity: sha512-TJmnOG2+NOGM72mlczEsNki9UT+XAsMFAOo8J0me/N47EJ/vkLXxf481evfHLlxMejTY6IN8SdRSiPVLv6AHlA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - libc: [musl] '@biomejs/cli-linux-x64@1.9.3': resolution: {integrity: sha512-x220V4c+romd26Mu1ptU+EudMXVS4xmzKxPVb9mgnfYlN4Yx9vD5NZraSx/onJnd3Gh/y8iPUdU5CDZJKg9COA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - libc: [glibc] '@biomejs/cli-win32-arm64@1.9.3': resolution: {integrity: sha512-lg/yZis2HdQGsycUvHWSzo9kOvnGgvtrYRgoCEwPBwwAL8/6crOp3+f47tPwI/LI1dZrhSji7PNsGKGHbwyAhw==} @@ -6650,84 +6646,72 @@ packages: engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.2': resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.2': resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.2': resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.2': resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.2': resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linux-arm64@0.33.3': resolution: {integrity: sha512-Zf+sF1jHZJKA6Gor9hoYG2ljr4wo9cY4twaxgFDvlG0Xz9V7sinsPp8pFd1XtlhTzYo0IhDbl3rK7P6MzHpnYA==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.33.3': resolution: {integrity: sha512-Q7Ee3fFSC9P7vUSqVEF0zccJsZ8GiiCJYGWDdhEjdlOeS9/jdkyJ6sUSPj+bL8VuOYFSbofrW0t/86ceVhx32w==} engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.33.3': resolution: {integrity: sha512-vFk441DKRFepjhTEH20oBlFrHcLjPfI8B0pMIxGm3+yilKyYeHEVvrZhYFdqIseSclIqbQ3SnZMwEMWonY5XFA==} engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.33.3': resolution: {integrity: sha512-Q4I++herIJxJi+qmbySd072oDPRkCg/SClLEIDh5IL9h1zjhqjv82H0Seupd+q2m0yOfD+/fJnjSoDFtKiHu2g==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.3': resolution: {integrity: sha512-qnDccehRDXadhM9PM5hLvcPRYqyFCBN31kq+ErBSZtZlsAc1U4Z85xf/RXv1qolkdu+ibw64fUDaRdktxTNP9A==} engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.33.3': resolution: {integrity: sha512-Jhchim8kHWIU/GZ+9poHMWRcefeaxFIs9EBqf9KtcC14Ojk6qua7ghKiPs0sbeLbLj/2IGBtDcxHyjCdYWkk2w==} engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-wasm32@0.33.3': resolution: {integrity: sha512-68zivsdJ0koE96stdUfM+gmyaK/NcoSZK5dV5CAjES0FUXS9lchYt8LAB5rTbM7nlWtxaU/2GON0HVN6/ZYJAQ==} @@ -6904,35 +6888,30 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-glibc@2.4.1': resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.4.1': resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@parcel/watcher-linux-x64-glibc@2.4.1': resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-x64-musl@2.4.1': resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@parcel/watcher-win32-arm64@2.4.1': resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} @@ -7046,55 +7025,46 @@ packages: resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.27.4': resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.27.4': resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.27.4': resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.27.4': resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.27.4': resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.27.4': resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.27.4': resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.27.4': resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} From 618de283f57d19397246f69dd476611abd56cf13 Mon Sep 17 00:00:00 2001 From: Anton Begehr Date: Wed, 11 Dec 2024 13:23:53 +0100 Subject: [PATCH 19/35] =?UTF-8?q?=F0=9F=90=9B=20Fix=20isDbError()-guard=20?= =?UTF-8?q?does=20not=20work=20(#12416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * isDbError() does not work Fixes #12400 * lint&format * Update packages/db/src/runtime/virtual.ts Co-authored-by: Bjorn Lu * use isDbError instead of "instanceof LibsqlError" * unused imports * mv isDbError to utils * Update .changeset/breezy-radios-grab.md --------- Co-authored-by: Bjorn Lu Co-authored-by: Emanuele Stoppa --- .changeset/breezy-radios-grab.md | 5 +++++ packages/db/src/core/cli/commands/execute/index.ts | 8 +++----- packages/db/src/core/cli/migration-queries.ts | 5 ++--- packages/db/src/core/integration/index.ts | 5 ++--- packages/db/src/runtime/utils.ts | 4 ++++ packages/db/src/runtime/virtual.ts | 5 +---- packages/db/test/test-utils.js | 5 +++-- 7 files changed, 20 insertions(+), 17 deletions(-) create mode 100644 .changeset/breezy-radios-grab.md diff --git a/.changeset/breezy-radios-grab.md b/.changeset/breezy-radios-grab.md new file mode 100644 index 0000000000..afb990a449 --- /dev/null +++ b/.changeset/breezy-radios-grab.md @@ -0,0 +1,5 @@ +--- +'@astrojs/db': patch +--- + +Fixes `isDbError()` guard for `LibsqlError` diff --git a/packages/db/src/core/cli/commands/execute/index.ts b/packages/db/src/core/cli/commands/execute/index.ts index 9a5a1b8e2f..66ecdd774b 100644 --- a/packages/db/src/core/cli/commands/execute/index.ts +++ b/packages/db/src/core/cli/commands/execute/index.ts @@ -1,5 +1,4 @@ import { existsSync } from 'node:fs'; -import { LibsqlError } from '@libsql/client'; import type { AstroConfig } from 'astro'; import { green } from 'kleur/colors'; import type { Arguments } from 'yargs-parser'; @@ -16,6 +15,7 @@ import { import { bundleFile, importBundledFile } from '../../../load-file.js'; import type { DBConfig } from '../../../types.js'; import { getManagedRemoteToken } from '../../../utils.js'; +import { isDbError } from '../../../../runtime/utils.js'; export async function cmd({ astroConfig, @@ -64,9 +64,7 @@ export async function cmd({ await mod.default(); console.info(`${green('✔')} File run successfully.`); } catch (e) { - if (e instanceof LibsqlError) { - throw new Error(EXEC_ERROR(e.message)); - } - throw e; + if (isDbError(e)) throw new Error(EXEC_ERROR(e.message)); + else throw e; } } diff --git a/packages/db/src/core/cli/migration-queries.ts b/packages/db/src/core/cli/migration-queries.ts index bd6360665d..db3972d095 100644 --- a/packages/db/src/core/cli/migration-queries.ts +++ b/packages/db/src/core/cli/migration-queries.ts @@ -1,5 +1,4 @@ import { stripVTControlCharacters } from 'node:util'; -import { LibsqlError } from '@libsql/client'; import deepDiff from 'deep-diff'; import { sql } from 'drizzle-orm'; import { SQLiteAsyncDialect } from 'drizzle-orm/sqlite-core'; @@ -8,7 +7,7 @@ import { customAlphabet } from 'nanoid'; import { hasPrimaryKey } from '../../runtime/index.js'; import { createRemoteDatabaseClient } from '../../runtime/index.js'; import { isSerializedSQL } from '../../runtime/types.js'; -import { safeFetch } from '../../runtime/utils.js'; +import { isDbError, safeFetch } from '../../runtime/utils.js'; import { MIGRATION_VERSION } from '../consts.js'; import { RENAME_COLUMN_ERROR, RENAME_TABLE_ERROR } from '../errors.js'; import { @@ -454,7 +453,7 @@ async function getDbCurrentSnapshot( } catch (error) { // Don't handle errors that are not from libSQL if ( - error instanceof LibsqlError && + isDbError(error) && // If the schema was never pushed to the database yet the table won't exist. // Treat a missing snapshot table as an empty table. diff --git a/packages/db/src/core/integration/index.ts b/packages/db/src/core/integration/index.ts index 200c7ddc25..51d3f80116 100644 --- a/packages/db/src/core/integration/index.ts +++ b/packages/db/src/core/integration/index.ts @@ -3,7 +3,6 @@ import { mkdir, writeFile } from 'node:fs/promises'; import { dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import type { ManagedAppToken } from '@astrojs/studio'; -import { LibsqlError } from '@libsql/client'; import type { AstroIntegration } from 'astro'; import { blue, yellow } from 'kleur/colors'; import { @@ -15,7 +14,7 @@ import { mergeConfig, } from 'vite'; import parseArgs from 'yargs-parser'; -import { AstroDbError } from '../../runtime/utils.js'; +import { AstroDbError, isDbError } from '../../runtime/utils.js'; import { CONFIG_FILE_NAMES, DB_PATH, VIRTUAL_MODULE_ID } from '../consts.js'; import { EXEC_DEFAULT_EXPORT_ERROR, EXEC_ERROR } from '../errors.js'; import { resolveDbConfig } from '../load-file.js'; @@ -206,7 +205,7 @@ async function executeSeedFile({ try { await mod.default(); } catch (e) { - if (e instanceof LibsqlError) { + if (isDbError(e)) { throw new AstroDbError(EXEC_ERROR(e.message)); } throw e; diff --git a/packages/db/src/runtime/utils.ts b/packages/db/src/runtime/utils.ts index 64301c39ee..74201957ff 100644 --- a/packages/db/src/runtime/utils.ts +++ b/packages/db/src/runtime/utils.ts @@ -42,6 +42,10 @@ export class DetailedLibsqlError extends LibsqlError { } } +export function isDbError(err: unknown): err is LibsqlError { + return err instanceof LibsqlError || (err instanceof Error && (err as any).libsqlError === true) +} + function slash(path: string) { const isExtendedLengthPath = path.startsWith('\\\\?\\'); diff --git a/packages/db/src/runtime/virtual.ts b/packages/db/src/runtime/virtual.ts index 6f008fe0d8..3da0c35491 100644 --- a/packages/db/src/runtime/virtual.ts +++ b/packages/db/src/runtime/virtual.ts @@ -21,10 +21,6 @@ function createColumn>(type: }; } -export function isDbError(err: unknown): err is LibsqlError { - return err instanceof LibsqlError; -} - export const column = { number: (opts: T = {} as T) => { return createColumn('number', opts) satisfies { type: 'number' }; @@ -90,3 +86,4 @@ export { } from 'drizzle-orm'; export { alias } from 'drizzle-orm/sqlite-core'; +export { isDbError } from './utils.js'; diff --git a/packages/db/test/test-utils.js b/packages/db/test/test-utils.js index 8315e85512..b608d75b8b 100644 --- a/packages/db/test/test-utils.js +++ b/packages/db/test/test-utils.js @@ -1,9 +1,10 @@ import { createServer } from 'node:http'; -import { LibsqlError, createClient } from '@libsql/client'; +import { createClient } from '@libsql/client'; import { z } from 'zod'; import { cli } from '../dist/core/cli/index.js'; import { resolveDbConfig } from '../dist/core/load-file.js'; import { getCreateIndexQueries, getCreateTableQuery } from '../dist/core/queries.js'; +import { isDbError } from '../dist/runtime/utils.js'; const singleQuerySchema = z.object({ sql: z.string(), @@ -142,7 +143,7 @@ function createRemoteDbServer() { JSON.stringify({ success: false, error: { - code: e instanceof LibsqlError ? e.code : 'SQLITE_QUERY_FAILED', + code: isDbError(e) ? e.code : 'SQLITE_QUERY_FAILED', details: e.message, }, }), From dff04a4b152d8b69fd09e01c1ddcae2f52c80bf1 Mon Sep 17 00:00:00 2001 From: Anton Begehr Date: Wed, 11 Dec 2024 12:24:49 +0000 Subject: [PATCH 20/35] [ci] format --- packages/db/src/core/cli/commands/execute/index.ts | 2 +- packages/db/src/runtime/utils.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/db/src/core/cli/commands/execute/index.ts b/packages/db/src/core/cli/commands/execute/index.ts index 66ecdd774b..0537362913 100644 --- a/packages/db/src/core/cli/commands/execute/index.ts +++ b/packages/db/src/core/cli/commands/execute/index.ts @@ -2,6 +2,7 @@ import { existsSync } from 'node:fs'; import type { AstroConfig } from 'astro'; import { green } from 'kleur/colors'; import type { Arguments } from 'yargs-parser'; +import { isDbError } from '../../../../runtime/utils.js'; import { EXEC_DEFAULT_EXPORT_ERROR, EXEC_ERROR, @@ -15,7 +16,6 @@ import { import { bundleFile, importBundledFile } from '../../../load-file.js'; import type { DBConfig } from '../../../types.js'; import { getManagedRemoteToken } from '../../../utils.js'; -import { isDbError } from '../../../../runtime/utils.js'; export async function cmd({ astroConfig, diff --git a/packages/db/src/runtime/utils.ts b/packages/db/src/runtime/utils.ts index 74201957ff..9a979b0627 100644 --- a/packages/db/src/runtime/utils.ts +++ b/packages/db/src/runtime/utils.ts @@ -43,7 +43,7 @@ export class DetailedLibsqlError extends LibsqlError { } export function isDbError(err: unknown): err is LibsqlError { - return err instanceof LibsqlError || (err instanceof Error && (err as any).libsqlError === true) + return err instanceof LibsqlError || (err instanceof Error && (err as any).libsqlError === true); } function slash(path: string) { From 110fc01a5b82d3dd4ec66653c4cb5488409ec8e5 Mon Sep 17 00:00:00 2001 From: Florian Lefebvre Date: Wed, 11 Dec 2024 16:01:06 +0100 Subject: [PATCH 21/35] chore: remove unused imports (#12696) --- benchmark/index.js | 2 +- benchmark/packages/adapter/src/index.ts | 2 +- biome.jsonc | 4 +++- packages/astro/src/assets/utils/imageAttributes.ts | 1 - packages/astro/src/core/app/index.ts | 1 - packages/astro/src/core/build/plugins/plugin-manifest.ts | 1 - packages/astro/src/core/build/plugins/plugin-ssr.ts | 1 - packages/astro/src/vite-plugin-astro-server/route.ts | 2 +- packages/astro/templates/env.mjs | 1 + packages/astro/test/units/routing/route-matching.test.js | 1 - packages/db/src/core/integration/index.ts | 1 - .../markdoc/src/html/transform/html-token-transform.ts | 1 + 12 files changed, 8 insertions(+), 10 deletions(-) diff --git a/benchmark/index.js b/benchmark/index.js index 956b9c3afa..0c62036d98 100755 --- a/benchmark/index.js +++ b/benchmark/index.js @@ -1,6 +1,6 @@ import fs from 'node:fs/promises'; import path from 'node:path'; -import { fileURLToPath, pathToFileURL } from 'node:url'; +import { pathToFileURL } from 'node:url'; import mri from 'mri'; import { makeProject } from './bench/_util.js'; diff --git a/benchmark/packages/adapter/src/index.ts b/benchmark/packages/adapter/src/index.ts index f2345deb08..0fc6d67f99 100644 --- a/benchmark/packages/adapter/src/index.ts +++ b/benchmark/packages/adapter/src/index.ts @@ -1,4 +1,4 @@ -import type { AstroAdapter, AstroIntegration } from 'astro'; +import type { AstroIntegration } from 'astro'; export default function createIntegration(): AstroIntegration { return { diff --git a/biome.jsonc b/biome.jsonc index bab1f1a05b..a1000760a7 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -34,6 +34,7 @@ "correctness": { "noUnusedVariables": "info", "noUnusedFunctionParameters": "info", + "noUnusedImports": "warn", }, }, }, @@ -87,11 +88,12 @@ }, }, { - "include": ["*.astro", "client.d.ts"], + "include": ["*.astro", "client.d.ts", "jsx-runtime.d.ts"], "linter": { "rules": { "correctness": { "noUnusedVariables": "off", + "noUnusedImports": "off", }, }, }, diff --git a/packages/astro/src/assets/utils/imageAttributes.ts b/packages/astro/src/assets/utils/imageAttributes.ts index 1b17e11b63..aa67b528f2 100644 --- a/packages/astro/src/assets/utils/imageAttributes.ts +++ b/packages/astro/src/assets/utils/imageAttributes.ts @@ -1,5 +1,4 @@ import { toStyleString } from '../../runtime/server/render/util.js'; -import type { AstroConfig } from '../../types/public/config.js'; import type { GetImageResult, ImageLayout, LocalImageProps, RemoteImageProps } from '../types.js'; export function addCSSVarsToStyle( diff --git a/packages/astro/src/core/app/index.ts b/packages/astro/src/core/app/index.ts index 36543b5cac..d23383133e 100644 --- a/packages/astro/src/core/app/index.ts +++ b/packages/astro/src/core/app/index.ts @@ -5,7 +5,6 @@ import { REROUTABLE_STATUS_CODES, REROUTE_DIRECTIVE_HEADER, clientAddressSymbol, - clientLocalsSymbol, responseSentSymbol, } from '../constants.js'; import { getSetCookiesFromResponse } from '../cookies/index.js'; diff --git a/packages/astro/src/core/build/plugins/plugin-manifest.ts b/packages/astro/src/core/build/plugins/plugin-manifest.ts index caebb470d5..f0589868f7 100644 --- a/packages/astro/src/core/build/plugins/plugin-manifest.ts +++ b/packages/astro/src/core/build/plugins/plugin-manifest.ts @@ -5,7 +5,6 @@ import type { Plugin as VitePlugin } from 'vite'; import { getAssetsPrefix } from '../../../assets/utils/getAssetsPrefix.js'; import { normalizeTheLocale } from '../../../i18n/index.js'; import { toFallbackType, toRoutingStrategy } from '../../../i18n/utils.js'; -import { unwrapSupportKind } from '../../../integrations/features-validation.js'; import { runHookBuildSsr } from '../../../integrations/hooks.js'; import { BEFORE_HYDRATION_SCRIPT_ID, PAGE_SCRIPT_ID } from '../../../vite-plugin-scripts/index.js'; import type { diff --git a/packages/astro/src/core/build/plugins/plugin-ssr.ts b/packages/astro/src/core/build/plugins/plugin-ssr.ts index 473aa95012..eea2be3e8e 100644 --- a/packages/astro/src/core/build/plugins/plugin-ssr.ts +++ b/packages/astro/src/core/build/plugins/plugin-ssr.ts @@ -1,5 +1,4 @@ import type { Plugin as VitePlugin } from 'vite'; -import type { AstroSettings } from '../../../types/astro.js'; import type { AstroAdapter } from '../../../types/public/integrations.js'; import { routeIsRedirect } from '../../redirects/index.js'; import { VIRTUAL_ISLAND_MAP_ID } from '../../server-islands/vite-plugin-server-islands.js'; diff --git a/packages/astro/src/vite-plugin-astro-server/route.ts b/packages/astro/src/vite-plugin-astro-server/route.ts index b4b6598054..eb353e501f 100644 --- a/packages/astro/src/vite-plugin-astro-server/route.ts +++ b/packages/astro/src/vite-plugin-astro-server/route.ts @@ -11,7 +11,7 @@ import { req } from '../core/messages.js'; import { loadMiddleware } from '../core/middleware/loadMiddleware.js'; import { routeIsRedirect } from '../core/redirects/index.js'; import { RenderContext } from '../core/render-context.js'; -import { type SSROptions, getProps } from '../core/render/index.js'; +import { getProps } from '../core/render/index.js'; import { createRequest } from '../core/request.js'; import { redirectTemplate } from '../core/routing/3xx.js'; import { matchAllRoutes } from '../core/routing/index.js'; diff --git a/packages/astro/templates/env.mjs b/packages/astro/templates/env.mjs index 9f36f1175b..6526033514 100644 --- a/packages/astro/templates/env.mjs +++ b/packages/astro/templates/env.mjs @@ -1,6 +1,7 @@ // @ts-check import { schema } from 'virtual:astro:env/internal'; import { + // biome-ignore lint/correctness/noUnusedImports: `_getEnv` is used by the generated code getEnv as _getEnv, createInvalidVariablesError, getEnvFieldType, diff --git a/packages/astro/test/units/routing/route-matching.test.js b/packages/astro/test/units/routing/route-matching.test.js index b524a7ea10..72900d3156 100644 --- a/packages/astro/test/units/routing/route-matching.test.js +++ b/packages/astro/test/units/routing/route-matching.test.js @@ -1,6 +1,5 @@ import * as assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; -import { fileURLToPath } from 'node:url'; import * as cheerio from 'cheerio'; import { createContainer } from '../../../dist/core/dev/container.js'; import { createViteLoader } from '../../../dist/core/module-loader/vite.js'; diff --git a/packages/db/src/core/integration/index.ts b/packages/db/src/core/integration/index.ts index 51d3f80116..36dc6b0f8b 100644 --- a/packages/db/src/core/integration/index.ts +++ b/packages/db/src/core/integration/index.ts @@ -26,7 +26,6 @@ import { type LateSeedFiles, type LateTables, type SeedHandler, - resolved, vitePluginDb, } from './vite-plugin-db.js'; diff --git a/packages/integrations/markdoc/src/html/transform/html-token-transform.ts b/packages/integrations/markdoc/src/html/transform/html-token-transform.ts index 2c6a5d1e2f..b80595f97b 100644 --- a/packages/integrations/markdoc/src/html/transform/html-token-transform.ts +++ b/packages/integrations/markdoc/src/html/transform/html-token-transform.ts @@ -1,6 +1,7 @@ import type { Tokenizer } from '@markdoc/markdoc'; import { Parser } from 'htmlparser2'; // @ts-expect-error This type isn't exported +// biome-ignore lint/correctness/noUnusedImports: not correctly detected because type isn't exported import type * as Token from 'markdown-it/lib/token'; export function htmlTokenTransform(tokenizer: Tokenizer, tokens: Token[]): Token[] { From 51ced3dba8ca2d1b2e5a322100639fd3f933b400 Mon Sep 17 00:00:00 2001 From: Florian Lefebvre Date: Wed, 11 Dec 2024 15:02:16 +0000 Subject: [PATCH 22/35] [ci] format --- packages/db/src/runtime/virtual.ts | 2 +- scripts/cmd/build.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/db/src/runtime/virtual.ts b/packages/db/src/runtime/virtual.ts index 3da0c35491..e01622c416 100644 --- a/packages/db/src/runtime/virtual.ts +++ b/packages/db/src/runtime/virtual.ts @@ -1,4 +1,4 @@ -import { LibsqlError } from '@libsql/client'; + import { sql as _sql } from 'drizzle-orm'; import type { BooleanColumnInput, diff --git a/scripts/cmd/build.js b/scripts/cmd/build.js index cf0ee5ad2b..d5a9336d85 100644 --- a/scripts/cmd/build.js +++ b/scripts/cmd/build.js @@ -1,6 +1,5 @@ import fs from 'node:fs/promises'; import esbuild from 'esbuild'; -import { copy } from 'esbuild-plugin-copy'; import glob from 'fast-glob'; import { dim, green, red, yellow } from 'kleur/colors'; import prebuild from './prebuild.js'; From f1f3bc043213fe7b3a653fb80d9e1353d58d17ca Mon Sep 17 00:00:00 2001 From: Florian Lefebvre Date: Wed, 11 Dec 2024 15:03:05 +0000 Subject: [PATCH 23/35] [ci] format --- packages/db/src/runtime/virtual.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/db/src/runtime/virtual.ts b/packages/db/src/runtime/virtual.ts index e01622c416..5f17823a85 100644 --- a/packages/db/src/runtime/virtual.ts +++ b/packages/db/src/runtime/virtual.ts @@ -1,4 +1,3 @@ - import { sql as _sql } from 'drizzle-orm'; import type { BooleanColumnInput, From ccc5ad1676db5e7f5049ca2feb59802d1fe3a92e Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Wed, 11 Dec 2024 15:23:50 +0000 Subject: [PATCH 24/35] fix(i18n): manual routing with rewrite (#12718) --- .changeset/fuzzy-windows-cover.md | 5 +++++ packages/astro/src/i18n/index.ts | 9 +++++++-- packages/astro/src/i18n/middleware.ts | 1 - packages/astro/src/virtual-modules/i18n.ts | 2 +- .../astro.config.mjs | 5 ++++- .../src/middleware.js | 1 + .../i18n-routing-manual-with-default-middleware.test.js | 9 +++++++++ 7 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 .changeset/fuzzy-windows-cover.md diff --git a/.changeset/fuzzy-windows-cover.md b/.changeset/fuzzy-windows-cover.md new file mode 100644 index 0000000000..7f3b766fc0 --- /dev/null +++ b/.changeset/fuzzy-windows-cover.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fixes an issue where Astro couldn't correctly handle i18n fallback when using the i18n middleware diff --git a/packages/astro/src/i18n/index.ts b/packages/astro/src/i18n/index.ts index 455e2e1414..e1e3750ea4 100644 --- a/packages/astro/src/i18n/index.ts +++ b/packages/astro/src/i18n/index.ts @@ -298,9 +298,14 @@ export function redirectToDefaultLocale({ } // NOTE: public function exported to the users via `astro:i18n` module -export function notFound({ base, locales }: MiddlewarePayload) { +export function notFound({ base, locales, fallback }: MiddlewarePayload) { return function (context: APIContext, response?: Response): Response | undefined { - if (response?.headers.get(REROUTE_DIRECTIVE_HEADER) === 'no') return response; + if ( + response?.headers.get(REROUTE_DIRECTIVE_HEADER) === 'no' && + typeof fallback === 'undefined' + ) { + return response; + } const url = context.url; // We return a 404 if: diff --git a/packages/astro/src/i18n/middleware.ts b/packages/astro/src/i18n/middleware.ts index eefb8a9dd5..c2805b1a32 100644 --- a/packages/astro/src/i18n/middleware.ts +++ b/packages/astro/src/i18n/middleware.ts @@ -83,7 +83,6 @@ export function createI18nMiddleware( } const { currentLocale } = context; - switch (i18n.strategy) { // NOTE: theoretically, we should never hit this code path case 'manual': { diff --git a/packages/astro/src/virtual-modules/i18n.ts b/packages/astro/src/virtual-modules/i18n.ts index 8f85ae5f61..d2e193fd7c 100644 --- a/packages/astro/src/virtual-modules/i18n.ts +++ b/packages/astro/src/virtual-modules/i18n.ts @@ -378,10 +378,10 @@ if (i18n?.routing === 'manual') { fallbackType = toFallbackType(customOptions); const manifest: SSRManifest['i18n'] = { ...i18n, - fallback: undefined, strategy, domainLookupTable: {}, fallbackType, + fallback: i18n.fallback, }; return I18nInternals.createMiddleware(manifest, base, trailingSlash, format); }; diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/astro.config.mjs b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/astro.config.mjs index 0638988f06..8006c260f8 100644 --- a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/astro.config.mjs +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/astro.config.mjs @@ -9,6 +9,9 @@ export default defineConfig({ codes: ["es", "es-ar"] } ], - routing: "manual" + routing: "manual", + fallback: { + it: 'en' + } } }) diff --git a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/middleware.js b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/middleware.js index 60d179ec71..afc3c6c607 100644 --- a/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/middleware.js +++ b/packages/astro/test/fixtures/i18n-routing-manual-with-default-middleware/src/middleware.js @@ -18,5 +18,6 @@ export const onRequest = sequence( customLogic, middleware({ prefixDefaultLocale: true, + fallbackType: "rewrite" }) ); diff --git a/packages/astro/test/i18n-routing-manual-with-default-middleware.test.js b/packages/astro/test/i18n-routing-manual-with-default-middleware.test.js index af900a43b5..0b24c6aa7a 100644 --- a/packages/astro/test/i18n-routing-manual-with-default-middleware.test.js +++ b/packages/astro/test/i18n-routing-manual-with-default-middleware.test.js @@ -117,4 +117,13 @@ describe('SSR manual routing', () => { const $ = cheerio.load(html); assert.equal($('p').text(), '/en/blog/title/'); }); + + it('should use the fallback', async () => { + let request = new Request('http://example.com/it/start'); + let response = await app.render(request); + assert.equal(response.status, 200); + const html = await response.text(); + const $ = cheerio.load(html); + assert.equal($('p').text(), '/en/blog/title/'); + }); }); From 14dffcc3af49dd975635602a0d1847a3125c0746 Mon Sep 17 00:00:00 2001 From: Magomed Chabaev Date: Wed, 11 Dec 2024 19:06:57 +0300 Subject: [PATCH 25/35] fix(actions): support trailing slash (#12657) * fix(actions): support trailing slash * refactoring --- .changeset/spicy-guests-protect.md | 5 ++++ packages/astro/src/actions/plugins.ts | 7 ++++++ .../src/actions/runtime/virtual/server.ts | 14 ++++++++++- .../src/actions/runtime/virtual/shared.ts | 3 +++ packages/astro/templates/actions.mjs | 17 +++++++++++-- packages/astro/test/actions.test.js | 24 +++++++++++++++++++ 6 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 .changeset/spicy-guests-protect.md diff --git a/.changeset/spicy-guests-protect.md b/.changeset/spicy-guests-protect.md new file mode 100644 index 0000000000..5f77d5ee01 --- /dev/null +++ b/.changeset/spicy-guests-protect.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Trailing slash support for actions diff --git a/packages/astro/src/actions/plugins.ts b/packages/astro/src/actions/plugins.ts index 77cbddca15..c97e3ea835 100644 --- a/packages/astro/src/actions/plugins.ts +++ b/packages/astro/src/actions/plugins.ts @@ -1,6 +1,7 @@ import type fsMod from 'node:fs'; import type { Plugin as VitePlugin } from 'vite'; import type { AstroSettings } from '../types/astro.js'; +import { shouldAppendForwardSlash } from '../core/build/util.js'; import { NOOP_ACTIONS, RESOLVED_VIRTUAL_INTERNAL_MODULE_ID, @@ -84,6 +85,12 @@ export function vitePluginActions({ code += `\nexport * from 'astro/actions/runtime/virtual/server.js';`; } else { code += `\nexport * from 'astro/actions/runtime/virtual/client.js';`; + code = code.replace( + "'/** @TRAILING_SLASH@ **/'", + JSON.stringify( + shouldAppendForwardSlash(settings.config.trailingSlash, settings.config.build.format), + ), + ); } return code; }, diff --git a/packages/astro/src/actions/runtime/virtual/server.ts b/packages/astro/src/actions/runtime/virtual/server.ts index 47decf18e5..8005c4d56a 100644 --- a/packages/astro/src/actions/runtime/virtual/server.ts +++ b/packages/astro/src/actions/runtime/virtual/server.ts @@ -1,6 +1,10 @@ import { z } from 'zod'; import { ActionCalledFromServerError } from '../../../core/errors/errors-data.js'; import { AstroError } from '../../../core/errors/errors.js'; +import type { Pipeline } from '../../../core/base-pipeline.js'; +import { apiContextRoutesSymbol } from '../../../core/render-context.js'; +import { shouldAppendForwardSlash } from '../../../core/build/util.js'; +import { removeTrailingForwardSlash } from '../../../core/path.js'; import type { APIContext } from '../../../types/public/index.js'; import { ACTION_RPC_ROUTE_PATTERN } from '../../consts.js'; import { @@ -279,7 +283,15 @@ export function getActionContext(context: APIContext): ActionMiddlewareContext { calledFrom: callerInfo.from, name: callerInfo.name, handler: async () => { - const baseAction = await getAction(callerInfo.name); + const pipeline: Pipeline = Reflect.get(context, apiContextRoutesSymbol); + const callerInfoName = shouldAppendForwardSlash( + pipeline.manifest.trailingSlash, + pipeline.manifest.buildFormat, + ) + ? removeTrailingForwardSlash(callerInfo.name) + : callerInfo.name; + + const baseAction = await getAction(callerInfoName); let input; try { input = await parseRequestBody(context.request); diff --git a/packages/astro/src/actions/runtime/virtual/shared.ts b/packages/astro/src/actions/runtime/virtual/shared.ts index 4067ad321d..36fb53c379 100644 --- a/packages/astro/src/actions/runtime/virtual/shared.ts +++ b/packages/astro/src/actions/runtime/virtual/shared.ts @@ -2,6 +2,7 @@ import { parse as devalueParse, stringify as devalueStringify } from 'devalue'; import type { z } from 'zod'; import { REDIRECT_STATUS_CODES } from '../../../core/constants.js'; import { ActionsReturnedInvalidDataError } from '../../../core/errors/errors-data.js'; +import { appendForwardSlash as _appendForwardSlash } from '../../../core/path.js'; import { AstroError } from '../../../core/errors/errors.js'; import { ACTION_QUERY_PARAMS as _ACTION_QUERY_PARAMS } from '../../consts.js'; import type { @@ -13,6 +14,8 @@ import type { export type ActionAPIContext = _ActionAPIContext; export const ACTION_QUERY_PARAMS = _ACTION_QUERY_PARAMS; +export const appendForwardSlash = _appendForwardSlash; + export const ACTION_ERROR_CODES = [ 'BAD_REQUEST', 'UNAUTHORIZED', diff --git a/packages/astro/templates/actions.mjs b/packages/astro/templates/actions.mjs index 82a287448a..e7343448b4 100644 --- a/packages/astro/templates/actions.mjs +++ b/packages/astro/templates/actions.mjs @@ -1,4 +1,9 @@ -import { ActionError, deserializeActionResult, getActionQueryString } from 'astro:actions'; +import { + ActionError, + deserializeActionResult, + getActionQueryString, + appendForwardSlash, +} from 'astro:actions'; const ENCODED_DOT = '%2E'; @@ -83,7 +88,15 @@ async function handleAction(param, path, context) { headers.set('Content-Length', '0'); } } - const rawResult = await fetch(`${import.meta.env.BASE_URL.replace(/\/$/, '')}/_actions/${path}`, { + + const shouldAppendTrailingSlash = '/** @TRAILING_SLASH@ **/'; + let actionPath = import.meta.env.BASE_URL.replace(/\/$/, '') + '/_actions/' + path; + + if (shouldAppendTrailingSlash) { + actionPath = appendForwardSlash(actionPath); + } + + const rawResult = await fetch(actionPath, { method: 'POST', body, headers, diff --git a/packages/astro/test/actions.test.js b/packages/astro/test/actions.test.js index d8da4e72e3..98e642102e 100644 --- a/packages/astro/test/actions.test.js +++ b/packages/astro/test/actions.test.js @@ -564,6 +564,30 @@ it('Base path should be used', async () => { await devServer.stop(); }); +it('Should support trailing slash', async () => { + const fixture = await loadFixture({ + root: './fixtures/actions/', + adapter: testAdapter(), + trailingSlash: "always" + }); + const devServer = await fixture.startDevServer(); + const formData = new FormData(); + formData.append('channel', 'bholmesdev'); + formData.append('comment', 'Hello, World!'); + const res = await fixture.fetch('/_actions/comment/', { + method: 'POST', + body: formData, + }); + + assert.equal(res.ok, true); + assert.equal(res.headers.get('Content-Type'), 'application/json+devalue'); + + const data = devalue.parse(await res.text()); + assert.equal(data.channel, 'bholmesdev'); + assert.equal(data.comment, 'Hello, World!'); + await devServer.stop(); +}); + /** * Follow an expected redirect response. * From eef4b740ffe56b167188fd1723b73a2a327d4640 Mon Sep 17 00:00:00 2001 From: Magomed Chabaev Date: Wed, 11 Dec 2024 16:07:47 +0000 Subject: [PATCH 26/35] [ci] format --- packages/astro/src/actions/plugins.ts | 2 +- packages/astro/src/actions/runtime/virtual/server.ts | 6 +++--- packages/astro/src/actions/runtime/virtual/shared.ts | 2 +- packages/astro/templates/actions.mjs | 2 +- packages/astro/test/actions.test.js | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/astro/src/actions/plugins.ts b/packages/astro/src/actions/plugins.ts index c97e3ea835..f5bd074dfc 100644 --- a/packages/astro/src/actions/plugins.ts +++ b/packages/astro/src/actions/plugins.ts @@ -1,7 +1,7 @@ import type fsMod from 'node:fs'; import type { Plugin as VitePlugin } from 'vite'; -import type { AstroSettings } from '../types/astro.js'; import { shouldAppendForwardSlash } from '../core/build/util.js'; +import type { AstroSettings } from '../types/astro.js'; import { NOOP_ACTIONS, RESOLVED_VIRTUAL_INTERNAL_MODULE_ID, diff --git a/packages/astro/src/actions/runtime/virtual/server.ts b/packages/astro/src/actions/runtime/virtual/server.ts index 8005c4d56a..10624134b2 100644 --- a/packages/astro/src/actions/runtime/virtual/server.ts +++ b/packages/astro/src/actions/runtime/virtual/server.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; +import type { Pipeline } from '../../../core/base-pipeline.js'; +import { shouldAppendForwardSlash } from '../../../core/build/util.js'; import { ActionCalledFromServerError } from '../../../core/errors/errors-data.js'; import { AstroError } from '../../../core/errors/errors.js'; -import type { Pipeline } from '../../../core/base-pipeline.js'; -import { apiContextRoutesSymbol } from '../../../core/render-context.js'; -import { shouldAppendForwardSlash } from '../../../core/build/util.js'; import { removeTrailingForwardSlash } from '../../../core/path.js'; +import { apiContextRoutesSymbol } from '../../../core/render-context.js'; import type { APIContext } from '../../../types/public/index.js'; import { ACTION_RPC_ROUTE_PATTERN } from '../../consts.js'; import { diff --git a/packages/astro/src/actions/runtime/virtual/shared.ts b/packages/astro/src/actions/runtime/virtual/shared.ts index 36fb53c379..02cc07b52c 100644 --- a/packages/astro/src/actions/runtime/virtual/shared.ts +++ b/packages/astro/src/actions/runtime/virtual/shared.ts @@ -2,8 +2,8 @@ import { parse as devalueParse, stringify as devalueStringify } from 'devalue'; import type { z } from 'zod'; import { REDIRECT_STATUS_CODES } from '../../../core/constants.js'; import { ActionsReturnedInvalidDataError } from '../../../core/errors/errors-data.js'; -import { appendForwardSlash as _appendForwardSlash } from '../../../core/path.js'; import { AstroError } from '../../../core/errors/errors.js'; +import { appendForwardSlash as _appendForwardSlash } from '../../../core/path.js'; import { ACTION_QUERY_PARAMS as _ACTION_QUERY_PARAMS } from '../../consts.js'; import type { ErrorInferenceObject, diff --git a/packages/astro/templates/actions.mjs b/packages/astro/templates/actions.mjs index e7343448b4..93aaa4d762 100644 --- a/packages/astro/templates/actions.mjs +++ b/packages/astro/templates/actions.mjs @@ -1,8 +1,8 @@ import { ActionError, + appendForwardSlash, deserializeActionResult, getActionQueryString, - appendForwardSlash, } from 'astro:actions'; const ENCODED_DOT = '%2E'; diff --git a/packages/astro/test/actions.test.js b/packages/astro/test/actions.test.js index 98e642102e..2af8ebdd97 100644 --- a/packages/astro/test/actions.test.js +++ b/packages/astro/test/actions.test.js @@ -568,7 +568,7 @@ it('Should support trailing slash', async () => { const fixture = await loadFixture({ root: './fixtures/actions/', adapter: testAdapter(), - trailingSlash: "always" + trailingSlash: 'always', }); const devServer = await fixture.startDevServer(); const formData = new FormData(); From 358eae83b7cf3d79395eea3824e321b502522547 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 12 Dec 2024 10:29:18 +0000 Subject: [PATCH 27/35] chore: fixes the version of astrojs/db (#12719) --- .changeset/hip-kids-ring.md | 5 +++++ packages/db/package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/hip-kids-ring.md diff --git a/.changeset/hip-kids-ring.md b/.changeset/hip-kids-ring.md new file mode 100644 index 0000000000..5dc22c5b8e --- /dev/null +++ b/.changeset/hip-kids-ring.md @@ -0,0 +1,5 @@ +--- +'@astrojs/db': patch +--- + +Fixes the publishing of the package diff --git a/packages/db/package.json b/packages/db/package.json index 7bac47649a..16b9b17216 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,6 +1,6 @@ { "name": "@astrojs/db", - "version": "0.14.1", + "version": "0.14.3", "description": "Add libSQL and Astro Studio support to your Astro site", "license": "MIT", "repository": { From e3bfd9396969caf35b3b05135539e82aab560c92 Mon Sep 17 00:00:00 2001 From: mtwilliams Date: Thu, 12 Dec 2024 08:29:46 -0500 Subject: [PATCH 28/35] fix(i18n): parse params and props correctly with fallback (#12709) Co-authored-by: Emanuele Stoppa --- .changeset/selfish-paws-play.md | 5 ++ .../astro/src/core/render/params-and-props.ts | 9 ++- .../src/pages/blog/[id].astro | 16 +++- .../src/pages/pt/blog/[id].astro | 10 ++- packages/astro/test/i18n-routing.test.js | 74 ++++++++++++++++++- 5 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 .changeset/selfish-paws-play.md diff --git a/.changeset/selfish-paws-play.md b/.changeset/selfish-paws-play.md new file mode 100644 index 0000000000..6f0e3049b2 --- /dev/null +++ b/.changeset/selfish-paws-play.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fixes a bug where Astro couldn't correctly parse `params` and `props` when receiving i18n fallback URLs diff --git a/packages/astro/src/core/render/params-and-props.ts b/packages/astro/src/core/render/params-and-props.ts index c1fe318ceb..f8799115b0 100644 --- a/packages/astro/src/core/render/params-and-props.ts +++ b/packages/astro/src/core/render/params-and-props.ts @@ -47,7 +47,8 @@ export async function getProps(opts: GetParamsAndPropsOptions): Promise { base, }); - // The pathname used here comes from the server, which already encored. + if (!staticPaths.length) return {}; + // The pathname used here comes from the server, which already encoded. // Since we decided to not mess up with encoding anymore, we need to decode them back so the parameters can match // the ones expected from the users const params = getParams(route, decodeURI(pathname)); @@ -77,7 +78,11 @@ export function getParams(route: RouteData, pathname: string): Params { if (!route.params.length) return {}; // The RegExp pattern expects a decoded string, but the pathname is encoded // when the URL contains non-English characters. - const paramsMatch = route.pattern.exec(pathname); + const paramsMatch = + route.pattern.exec(pathname) || + route.fallbackRoutes + .map((fallbackRoute) => fallbackRoute.pattern.exec(pathname)) + .find((x) => x); if (!paramsMatch) return {}; const params: Params = {}; route.params.forEach((key, i) => { diff --git a/packages/astro/test/fixtures/i18n-routing-fallback/src/pages/blog/[id].astro b/packages/astro/test/fixtures/i18n-routing-fallback/src/pages/blog/[id].astro index 97b41230d6..f277b93efe 100644 --- a/packages/astro/test/fixtures/i18n-routing-fallback/src/pages/blog/[id].astro +++ b/packages/astro/test/fixtures/i18n-routing-fallback/src/pages/blog/[id].astro @@ -1,18 +1,28 @@ --- +// for SSR +const blogs = { + 1: { content: "Hello world" }, + 2: { content: "Eat Something" }, + 3: { content: "How are you?" }, +} +const id = Astro.params?.id; +const ssrContent = id && blogs[id]?.content; + +// for SSG export function getStaticPaths() { return [ {params: {id: '1'}, props: { content: "Hello world" }}, {params: {id: '2'}, props: { content: "Eat Something" }}, {params: {id: '3'}, props: { content: "How are you?" }}, - ]; + ] } -const { content } = Astro.props; +const { content } = Astro.props --- Astro -{content} +{content || ssrContent} diff --git a/packages/astro/test/fixtures/i18n-routing-fallback/src/pages/pt/blog/[id].astro b/packages/astro/test/fixtures/i18n-routing-fallback/src/pages/pt/blog/[id].astro index e37f83a302..ed4415fc5b 100644 --- a/packages/astro/test/fixtures/i18n-routing-fallback/src/pages/pt/blog/[id].astro +++ b/packages/astro/test/fixtures/i18n-routing-fallback/src/pages/pt/blog/[id].astro @@ -1,4 +1,12 @@ --- +const blogs = { + 1: { content: "Hola mundo" }, + 2: { content: "Eat Something" }, + 3: { content: "How are you?" }, +} +const id = Astro.params?.id; +const ssrContent = id && blogs[id]?.content; + export function getStaticPaths() { return [ {params: {id: '1'}, props: { content: "Hola mundo" }}, @@ -13,6 +21,6 @@ const { content } = Astro.props; Astro -{content} +{content || ssrContent} diff --git a/packages/astro/test/i18n-routing.test.js b/packages/astro/test/i18n-routing.test.js index 441823fc7a..28f4b05f80 100644 --- a/packages/astro/test/i18n-routing.test.js +++ b/packages/astro/test/i18n-routing.test.js @@ -1,6 +1,6 @@ +import * as cheerio from 'cheerio'; import * as assert from 'node:assert/strict'; import { after, afterEach, before, describe, it } from 'node:test'; -import * as cheerio from 'cheerio'; import testAdapter from './test-adapter.js'; import { loadFixture } from './test-utils.js'; @@ -2000,12 +2000,14 @@ describe('Fallback rewrite dev server', () => { root: './fixtures/i18n-routing-fallback/', i18n: { defaultLocale: 'en', - locales: ['en', 'fr'], + locales: ['en', 'fr', 'es', 'it', 'pt'], routing: { prefixDefaultLocale: false, }, fallback: { fr: 'en', + it: 'en', + es: 'pt', }, fallbackType: 'rewrite', }, @@ -2021,6 +2023,27 @@ describe('Fallback rewrite dev server', () => { assert.match(html, /Hello/); // assert.fail() }); + + it('should render fallback locale paths with path parameters correctly (fr)', async () => { + let response = await fixture.fetch('/fr/blog/1'); + assert.equal(response.status, 200); + const text = await response.text(); + assert.match(text, /Hello world/); + }); + + it('should render fallback locale paths with path parameters correctly (es)', async () => { + let response = await fixture.fetch('/es/blog/1'); + assert.equal(response.status, 200); + const text = await response.text(); + assert.match(text, /Hola mundo/); + }); + + it('should render fallback locale paths with query parameters correctly (it)', async () => { + let response = await fixture.fetch('/it/blog/1'); + assert.equal(response.status, 200); + const text = await response.text(); + assert.match(text, /Hello world/); + }); }); describe('Fallback rewrite SSG', () => { @@ -2032,13 +2055,15 @@ describe('Fallback rewrite SSG', () => { root: './fixtures/i18n-routing-fallback/', i18n: { defaultLocale: 'en', - locales: ['en', 'fr'], + locales: ['en', 'fr', 'es', 'it', 'pt'], routing: { prefixDefaultLocale: false, fallbackType: 'rewrite', }, fallback: { fr: 'en', + it: 'en', + es: 'pt', }, }, }); @@ -2051,6 +2076,21 @@ describe('Fallback rewrite SSG', () => { assert.match(html, /Hello/); // assert.fail() }); + + it('should render fallback locale paths with path parameters correctly (fr)', async () => { + const html = await fixture.readFile('/fr/blog/1/index.html'); + assert.match(html, /Hello world/); + }); + + it('should render fallback locale paths with path parameters correctly (es)', async () => { + const html = await fixture.readFile('/es/blog/1/index.html'); + assert.match(html, /Hola mundo/); + }); + + it('should render fallback locale paths with query parameters correctly (it)', async () => { + const html = await fixture.readFile('/it/blog/1/index.html'); + assert.match(html, /Hello world/); + }); }); describe('Fallback rewrite SSR', () => { @@ -2066,13 +2106,15 @@ describe('Fallback rewrite SSR', () => { adapter: testAdapter(), i18n: { defaultLocale: 'en', - locales: ['en', 'fr'], + locales: ['en', 'fr', 'es', 'it', 'pt'], routing: { prefixDefaultLocale: false, fallbackType: 'rewrite', }, fallback: { fr: 'en', + it: 'en', + es: 'pt', }, }, }); @@ -2087,4 +2129,28 @@ describe('Fallback rewrite SSR', () => { const html = await response.text(); assert.match(html, /Hello/); }); + + it('should render fallback locale paths with path parameters correctly (fr)', async () => { + let request = new Request('http://example.com/new-site/fr/blog/1'); + let response = await app.render(request); + assert.equal(response.status, 200); + const text = await response.text(); + assert.match(text, /Hello world/); + }); + + it('should render fallback locale paths with path parameters correctly (es)', async () => { + let request = new Request('http://example.com/new-site/es/blog/1'); + let response = await app.render(request); + assert.equal(response.status, 200); + const text = await response.text(); + assert.match(text, /Hola mundo/); + }); + + it('should render fallback locale paths with query parameters correctly (it)', async () => { + let request = new Request('http://example.com/new-site/it/blog/1'); + let response = await app.render(request); + assert.equal(response.status, 200); + const text = await response.text(); + assert.match(text, /Hello world/); + }); }); From 799c8676dfba0d281faf2a3f2d9513518b57593b Mon Sep 17 00:00:00 2001 From: mtwilliams Date: Thu, 12 Dec 2024 13:30:38 +0000 Subject: [PATCH 29/35] [ci] format --- packages/astro/test/i18n-routing.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/test/i18n-routing.test.js b/packages/astro/test/i18n-routing.test.js index 28f4b05f80..27491069d3 100644 --- a/packages/astro/test/i18n-routing.test.js +++ b/packages/astro/test/i18n-routing.test.js @@ -1,6 +1,6 @@ -import * as cheerio from 'cheerio'; import * as assert from 'node:assert/strict'; import { after, afterEach, before, describe, it } from 'node:test'; +import * as cheerio from 'cheerio'; import testAdapter from './test-adapter.js'; import { loadFixture } from './test-utils.js'; From 029661daa9b28fd5299d8cc9360025c78f6cd8eb Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Fri, 13 Dec 2024 07:07:21 +0000 Subject: [PATCH 30/35] fix: use atomic writes for data store file operations (#12715) * fix: use atomic writes for data store file operations * Put tmp alongside the target * Implement locking * Refactor * Wording --- .changeset/tame-bags-remember.md | 5 ++ .../astro/src/content/mutable-data-store.ts | 48 +++++++++++++++++-- 2 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 .changeset/tame-bags-remember.md diff --git a/.changeset/tame-bags-remember.md b/.changeset/tame-bags-remember.md new file mode 100644 index 0000000000..3f4f61bce7 --- /dev/null +++ b/.changeset/tame-bags-remember.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fixes a bug that caused errors in dev when editing sites with large numbers of MDX pages diff --git a/packages/astro/src/content/mutable-data-store.ts b/packages/astro/src/content/mutable-data-store.ts index fdffec7cb8..573adeaaf9 100644 --- a/packages/astro/src/content/mutable-data-store.ts +++ b/packages/astro/src/content/mutable-data-store.ts @@ -9,6 +9,8 @@ import { contentModuleToId } from './utils.js'; const SAVE_DEBOUNCE_MS = 500; +const MAX_DEPTH = 10; + /** * Extends the DataStore with the ability to change entries and write them to disk. * This is kept as a separate class to avoid needing node builtins at runtime, when read-only access is all that is needed. @@ -86,7 +88,7 @@ export class MutableDataStore extends ImmutableDataStore { if (this.#assetImports.size === 0) { try { - await fs.writeFile(filePath, 'export default new Map();'); + await this.#writeFileAtomic(filePath, 'export default new Map();'); } catch (err) { throw new AstroError(AstroErrorData.UnknownFilesystemError, { cause: err }); } @@ -110,7 +112,7 @@ ${imports.join('\n')} export default new Map([${exports.join(', ')}]); `; try { - await fs.writeFile(filePath, code); + await this.#writeFileAtomic(filePath, code); } catch (err) { throw new AstroError(AstroErrorData.UnknownFilesystemError, { cause: err }); } @@ -122,7 +124,7 @@ export default new Map([${exports.join(', ')}]); if (this.#moduleImports.size === 0) { try { - await fs.writeFile(filePath, 'export default new Map();'); + await this.#writeFileAtomic(filePath, 'export default new Map();'); } catch (err) { throw new AstroError(AstroErrorData.UnknownFilesystemError, { cause: err }); } @@ -143,7 +145,7 @@ export default new Map([${exports.join(', ')}]); export default new Map([\n${lines.join(',\n')}]); `; try { - await fs.writeFile(filePath, code); + await this.#writeFileAtomic(filePath, code); } catch (err) { throw new AstroError(AstroErrorData.UnknownFilesystemError, { cause: err }); } @@ -190,6 +192,42 @@ export default new Map([\n${lines.join(',\n')}]); } } + #writing = new Set(); + #pending = new Set(); + + async #writeFileAtomic(filePath: PathLike, data: string, depth = 0) { + if(depth > MAX_DEPTH) { + // If we hit the max depth, we skip a write to prevent the stack from growing too large + // In theory this means we may miss the latest data, but in practice this will only happen when the file is being written to very frequently + // so it will be saved on the next write. This is unlikely to ever happen in practice, as the writes are debounced. It requires lots of writes to very large files. + return; + } + const fileKey = filePath.toString(); + // If we are already writing this file, instead of writing now, flag it as pending and write it when we're done. + if (this.#writing.has(fileKey)) { + this.#pending.add(fileKey); + return; + } + // Prevent concurrent writes to this file by flagging it as being written + this.#writing.add(fileKey); + + const tempFile = filePath instanceof URL ? new URL(`${filePath.href}.tmp`) : `${filePath}.tmp`; + try { + // Write it to a temporary file first and then move it to prevent partial reads. + await fs.writeFile(tempFile, data); + await fs.rename(tempFile, filePath); + } finally { + // We're done writing. Unflag the file and check if there are any pending writes for this file. + this.#writing.delete(fileKey); + // If there are pending writes, we need to write again to ensure we flush the latest data. + if (this.#pending.has(fileKey)) { + this.#pending.delete(fileKey); + // Call ourself recursively to write the file again + await this.#writeFileAtomic(filePath, data, depth + 1); + } + } + } + scopedStore(collectionName: string): DataStore { return { get: = Record>(key: string) => @@ -298,7 +336,7 @@ export default new Map([\n${lines.join(',\n')}]); return; } try { - await fs.writeFile(filePath, this.toString()); + await this.#writeFileAtomic(filePath, this.toString()); this.#file = filePath; this.#dirty = false; } catch (err) { From 72f30ddbf3febbf0d60896af4073ffc596ac9eef Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Fri, 13 Dec 2024 07:08:08 +0000 Subject: [PATCH 31/35] [ci] format --- packages/astro/src/content/mutable-data-store.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/astro/src/content/mutable-data-store.ts b/packages/astro/src/content/mutable-data-store.ts index 573adeaaf9..7f125ed4b4 100644 --- a/packages/astro/src/content/mutable-data-store.ts +++ b/packages/astro/src/content/mutable-data-store.ts @@ -196,7 +196,7 @@ export default new Map([\n${lines.join(',\n')}]); #pending = new Set(); async #writeFileAtomic(filePath: PathLike, data: string, depth = 0) { - if(depth > MAX_DEPTH) { + if (depth > MAX_DEPTH) { // If we hit the max depth, we skip a write to prevent the stack from growing too large // In theory this means we may miss the latest data, but in practice this will only happen when the file is being written to very frequently // so it will be saved on the next write. This is unlikely to ever happen in practice, as the writes are debounced. It requires lots of writes to very large files. @@ -213,7 +213,7 @@ export default new Map([\n${lines.join(',\n')}]); const tempFile = filePath instanceof URL ? new URL(`${filePath.href}.tmp`) : `${filePath}.tmp`; try { - // Write it to a temporary file first and then move it to prevent partial reads. + // Write it to a temporary file first and then move it to prevent partial reads. await fs.writeFile(tempFile, data); await fs.rename(tempFile, filePath); } finally { From ee66a45b250703a40b34c0a45ae34aefcb14ea44 Mon Sep 17 00:00:00 2001 From: Adam Argyle Date: Fri, 13 Dec 2024 02:40:23 -0800 Subject: [PATCH 32/35] Adds `closedby` to dialog interface (#12728) * Adds `closedby` to dialog interface Standards status https://chromestatus.com/feature/5097714453577728 * Add changeset --------- Co-authored-by: Chris Swithinbank --- .changeset/neat-pumas-accept.md | 5 +++++ packages/astro/astro-jsx.d.ts | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/neat-pumas-accept.md diff --git a/.changeset/neat-pumas-accept.md b/.changeset/neat-pumas-accept.md new file mode 100644 index 0000000000..8babf49e78 --- /dev/null +++ b/.changeset/neat-pumas-accept.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Adds type support for the `closedby` attribute for `` elements diff --git a/packages/astro/astro-jsx.d.ts b/packages/astro/astro-jsx.d.ts index ca54b991ed..39cb40f61b 100644 --- a/packages/astro/astro-jsx.d.ts +++ b/packages/astro/astro-jsx.d.ts @@ -679,6 +679,7 @@ declare namespace astroHTML.JSX { interface DialogHTMLAttributes extends HTMLAttributes { open?: boolean | string | undefined | null; + closedby?: 'none' | 'closerequest' | 'any' | undefined | null; } interface EmbedHTMLAttributes extends HTMLAttributes { From 8b1cecd6b491654ae760a0c75f3270df134c4e25 Mon Sep 17 00:00:00 2001 From: JoeMorgan Date: Fri, 13 Dec 2024 08:59:02 -0500 Subject: [PATCH 33/35] Add inert attribute to boolean list (#12729) * added changeset * added changeset --- .changeset/twelve-donuts-hide.md | 5 +++++ packages/astro/src/runtime/server/render/util.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/twelve-donuts-hide.md diff --git a/.changeset/twelve-donuts-hide.md b/.changeset/twelve-donuts-hide.md new file mode 100644 index 0000000000..504d1b5bea --- /dev/null +++ b/.changeset/twelve-donuts-hide.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +"Added `inert` to htmlBooleanAttributes" diff --git a/packages/astro/src/runtime/server/render/util.ts b/packages/astro/src/runtime/server/render/util.ts index 9c771a0de0..d693ad070f 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|checked|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|inert|loop|nomodule|novalidate|open|playsinline|readonly|required|reversed|scoped|seamless|selected|itemscope)$/i; const AMPERSAND_REGEX = /&/g; const DOUBLE_QUOTE_REGEX = /"/g; From 901c21f4f09bf61dfbb5ab04db2d7d90120383cb Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Fri, 13 Dec 2024 14:37:25 +0000 Subject: [PATCH 34/35] test: make tailwind test more stable (#12732) --- .../tailwind/test/fixtures/basic/tailwind.config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/integrations/tailwind/test/fixtures/basic/tailwind.config.js b/packages/integrations/tailwind/test/fixtures/basic/tailwind.config.js index f109096816..278abf14d6 100644 --- a/packages/integrations/tailwind/test/fixtures/basic/tailwind.config.js +++ b/packages/integrations/tailwind/test/fixtures/basic/tailwind.config.js @@ -1,6 +1,7 @@ import path from 'node:path'; +import {fileURLToPath} from "node:url"; /** @type {import('tailwindcss').Config} */ export default { - content: [path.join(__dirname, 'src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}')], + content: [path.join(path.dirname(fileURLToPath(import.meta.url)), 'src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}')], }; From 7c7398c04653877da09c7b0f80ee84b02e02aad0 Mon Sep 17 00:00:00 2001 From: Florian Lefebvre Date: Fri, 13 Dec 2024 16:37:08 +0100 Subject: [PATCH 35/35] fix(cli): let sync throw in check (#12726) --- .changeset/twenty-keys-divide.md | 5 +++++ packages/astro/src/cli/check/index.ts | 6 +----- 2 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 .changeset/twenty-keys-divide.md diff --git a/.changeset/twenty-keys-divide.md b/.changeset/twenty-keys-divide.md new file mode 100644 index 0000000000..9e84058674 --- /dev/null +++ b/.changeset/twenty-keys-divide.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fixes a case where failing content entries in `astro check` would not be surfaced diff --git a/packages/astro/src/cli/check/index.ts b/packages/astro/src/cli/check/index.ts index c93e3b2f4c..b7e03aa30e 100644 --- a/packages/astro/src/cli/check/index.ts +++ b/packages/astro/src/cli/check/index.ts @@ -31,11 +31,7 @@ export async function check(flags: Flags) { // NOTE: In the future, `@astrojs/check` can expose a `before lint` hook so that this works during `astro check --watch` too. // For now, we run this once as usually `astro check --watch` is ran alongside `astro dev` which also calls `astro sync`. const { default: sync } = await import('../../core/sync/index.js'); - try { - await sync(flagsToAstroInlineConfig(flags)); - } catch (_) { - return process.exit(1); - } + await sync(flagsToAstroInlineConfig(flags)); } const { check: checker, parseArgsAsCheckConfig } = checkPackage;