diff --git a/packages/astro/src/content/content-layer.ts b/packages/astro/src/content/content-layer.ts index 0f819847bd37..2362f2e00e45 100644 --- a/packages/astro/src/content/content-layer.ts +++ b/packages/astro/src/content/content-layer.ts @@ -284,6 +284,8 @@ class ContentLayer { false, // FUTURE: Remove in this in v6 id.endsWith('.svg'), + undefined, + this.#settings, ); return parsedData; diff --git a/packages/astro/src/content/utils.ts b/packages/astro/src/content/utils.ts index 55e69042bb7e..402fae8f4048 100644 --- a/packages/astro/src/content/utils.ts +++ b/packages/astro/src/content/utils.ts @@ -16,6 +16,7 @@ import { normalizePath } from '../core/viteUtils.js'; import type { AstroSettings } from '../types/astro.js'; import type { AstroConfig } from '../types/public/config.js'; import type { ContentEntryType, DataEntryType } from '../types/public/content.js'; +import { getConfigAlias } from '../vite-plugin-config-alias/index.js'; import { type CONTENT_FLAGS, CONTENT_LAYER_TYPE, @@ -155,7 +156,8 @@ export async function getEntryDataAndImages< collectionConfig: CollectionConfig, shouldEmitFile: boolean, experimentalSvgEnabled: boolean, - pluginContext?: PluginContext, + pluginContext: PluginContext | undefined = undefined, + astroSettings: AstroSettings, ): Promise<{ data: TOutputData; imageImports: Array }> { let data: TOutputData; // Legacy content collections have 'slug' removed @@ -169,6 +171,7 @@ export async function getEntryDataAndImages< let schema = collectionConfig.schema; const imageImports = new Set(); + const importAliases = getConfigAlias(astroSettings); if (typeof schema === 'function') { if (pluginContext) { @@ -190,7 +193,7 @@ export async function getEntryDataAndImages< // - Relative paths (./foo, ../foo) // - Absolute paths (/foo) // - URLs (http://...) - // - Aliases (~/, @/, etc.) + // - Aliases (~/, @/, tsconfig aliases) let normalizedPath = val; if ( val && @@ -199,7 +202,8 @@ export async function getEntryDataAndImages< !val.startsWith('/') && !val.startsWith('~') && !val.startsWith('@') && - !val.includes('://') + !val.includes('://') && + !importAliases?.some((alias) => alias.find.test(val)) ) { normalizedPath = `./${val}`; } @@ -273,7 +277,8 @@ export async function getEntryData( collectionConfig: CollectionConfig, shouldEmitFile: boolean, experimentalSvgEnabled: boolean, - pluginContext?: PluginContext, + pluginContext: PluginContext | undefined = undefined, + astroSettings: AstroSettings, ) { const { data } = await getEntryDataAndImages( entry, @@ -281,6 +286,7 @@ export async function getEntryData( shouldEmitFile, experimentalSvgEnabled, pluginContext, + astroSettings, ); 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 23a6147ce363..115aaf47d7db 100644 --- a/packages/astro/src/content/vite-plugin-content-imports.ts +++ b/packages/astro/src/content/vite-plugin-content-imports.ts @@ -9,7 +9,6 @@ import { AstroError } from '../core/errors/errors.js'; import { AstroErrorData } from '../core/errors/index.js'; import type { Logger } from '../core/logger/core.js'; import type { AstroSettings } from '../types/astro.js'; -import type { AstroConfig } from '../types/public/config.js'; import type { ContentEntryModule, ContentEntryType, @@ -105,7 +104,7 @@ export function astroContentImportPlugin({ fileId, entryConfigByExt: dataEntryConfigByExt, contentDir, - config: settings.config, + settings, fs, pluginContext: this, shouldEmitFile, @@ -128,7 +127,7 @@ export const _internal = { fileId, entryConfigByExt: contentEntryConfigByExt, contentDir, - config: settings.config, + settings, fs, pluginContext: this, shouldEmitFile, @@ -210,7 +209,7 @@ type GetEntryModuleParams = contentDir: URL; pluginContext: PluginContext; entryConfigByExt: Map; - config: AstroConfig; + settings: AstroSettings; shouldEmitFile: boolean; }; @@ -248,6 +247,7 @@ async function getContentEntryModule( // FUTURE: Remove in this in v6 id.endsWith('.svg'), pluginContext, + params.settings, ) : unvalidatedData; @@ -285,6 +285,7 @@ async function getDataEntryModule( // FUTURE: Remove in this in v6 id.endsWith('.svg'), pluginContext, + params.settings, ) : unvalidatedData; diff --git a/packages/astro/src/vite-plugin-config-alias/index.ts b/packages/astro/src/vite-plugin-config-alias/index.ts index f06127a8e720..c25fe078392d 100644 --- a/packages/astro/src/vite-plugin-config-alias/index.ts +++ b/packages/astro/src/vite-plugin-config-alias/index.ts @@ -9,7 +9,7 @@ type Alias = { }; /** Returns a list of compiled aliases. */ -const getConfigAlias = (settings: AstroSettings): Alias[] | null => { +export const getConfigAlias = (settings: AstroSettings): Alias[] | null => { const { tsConfig, tsConfigPath } = settings; if (!tsConfig || !tsConfigPath || !tsConfig.compilerOptions) return null; diff --git a/packages/astro/test/content-layer.test.js b/packages/astro/test/content-layer.test.js index 0dc171ceeddf..37a31c024d4e 100644 --- a/packages/astro/test/content-layer.test.js +++ b/packages/astro/test/content-layer.test.js @@ -291,6 +291,11 @@ describe('Content Layer', () => { assert.equal(json.rockets[1].data.image.format, 'jpg'); }); + it('loads images with tsconfig aliases in JSON', async () => { + assert.ok(json.rockets[2].data.image.src.startsWith('/_astro')); + assert.equal(json.rockets[2].data.image.format, 'jpg'); + }); + it('renders images from frontmatter', async () => { assert.ok($('img[alt="Lunar Module"]').attr('src').startsWith('/_astro')); }); diff --git a/packages/astro/test/fixtures/content-layer/src/data/rockets.json b/packages/astro/test/fixtures/content-layer/src/data/rockets.json index aa40e45a9b80..c60876a73d74 100644 --- a/packages/astro/test/fixtures/content-layer/src/data/rockets.json +++ b/packages/astro/test/fixtures/content-layer/src/data/rockets.json @@ -10,5 +10,11 @@ "name": "Saturn V", "manufacturer": "NASA", "image": "./shuttle.jpg" + }, + { + "id": "apollo-11", + "name": "Apollo 11", + "manufacturer": "NASA", + "image": "$images/shuttle.jpg" } ] diff --git a/packages/astro/test/fixtures/content-layer/tsconfig.json b/packages/astro/test/fixtures/content-layer/tsconfig.json new file mode 100644 index 000000000000..52ebe53bf186 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "astro/tsconfigs/base", + "compilerOptions": { + "paths": { + "$images/*": ["./images/*"] + } + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2512c39ca47..33f772f8d432 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2782,6 +2782,12 @@ importers: specifier: workspace:* version: link:../../.. + packages/astro/test/fixtures/content-layer-tsconfig-alias: + dependencies: + astro: + specifier: workspace:* + version: link:../../.. + packages/astro/test/fixtures/content-ssr-integration: dependencies: '@astrojs/mdx':